Jméno: Tomáš Batěk E-mail: [email protected]
Postup:
- ze vzoru jsem dostal fetchnuté repozitáře Alice, Boba a Charlieho
- každý repozotář má jenom jednu větev (master), takže jsem pro každý master vytvořil vlastní větev (alice, bob, charlie)
- přepnul jsem do větve alice a mergnul bobův master, to způsobilo konflikty v src/dfi.sh - nechal jsem obě funkcionality a commitnul
- poté jsem mergnul charlieho, při tom žádné konflikty nezvnikly
Použité příkazy pro spojení repozitářů:
git branch alice alice/master
git branch bob bob/master
git branch charlie charlie/master
git checkout alice
git merge bob
git add src/dfi.sh
git commit
git merge charlie
- pro odstranění merge commitů jsem udělal rebase interactive na commit před narušením linearity
- musel jsem vyřešit konflikty u
Makefile
asrc/dfi.sh
- pro odstranění fixupů jsem udělal rebase interactive na ten stejný commit a squasnul jsem fixup! commity
- nakonec jsem přejmenoval větev a pushnul ji
Použité příkazy pro odstranění merge
a fixup!
commitů:
git rebase -i 221e11b
git add Makefile
git rebase --continue
git add src/dfi.sh
git rebase --continue
git rebase -i 221e11b
git branch -m merged
git push origin merged
Postup:
- soubor .gitattributes jsem navrhl tak, aby v repozitáři normalizoval všechny soubory, které považuje za text
- také jsem do .gitattributes přímo specifikoval, aby soubory .ics měly v repozotáři CRLF konce řádků
- když jsem chtěl provést změnu v celé historii, použil jsem příkaz
git filter-branch
- soubor .gitattributes není verzovaný a nikde v historii není, takže jsem ho musel při každém kroku vytvořit, než jsem mohl normalizovat
Návrh obsahu souboru .gitattributes
:
* text=auto
*.ics text=crlf
Použité příkazy pro normalizaci konců řádků:
git checkout -b normalised
git filter-branch --tree-filter 'echo "* text=auto" > .gitattributes && echo "*.ics text=crlf" >> .gitattributes && git add --renormalize . && rm -f .gitattributes'
git push origin normalised
Postup:
- soubory
events.ics
aevents.ics.peek
byly přidány v commitua177898
a od té doby nebyly upraveny - použil jsem tedy rebase a upravil tento commit tak, abych ze souborů odstranil zmíněná osobní data
Použité příkazy:
git checkout -b safe
git rebase -i a177898^
git add --all
git commit --amend
git rebase --continue
git push origin safe
Postup:
- opět jsem si našel commit
c6926e1
, kde byl přidán soubora.out
a všiml si, že od té doby již nebyl nikdy upravován - znovu jsem tedy použil rebase na tento commit, abych soubor smazal
- do
.gitignore
jsem přidala.out
, aby už soubory s tímto názvem ignoroval, a složkubin/
, aby git ignoroval zkompilované binárky příkazemmake
Použité příkazy:
git checkout -b clean
git rebase -i c6926e1^
rm -f a.out
git add src/image_histogram/a.out
git commit --amend
git rebase --continue
git push origin clean
Návrh .gitignore
:
a.out
bin/
Postup:
- použil jsem rebase na commit, kde byl uveden špatný autor a autora opravil
- kdybych chtěl opravit autory u mnoha commitů, použil bych způsob ukázaný přímo na přednášce - použití skriptu na filter-branch
Použité příkazy:
git checkout -b fix-author
git rebase -i ebc7a20^
git commit --author "Charlie <[email protected]>" --amend
git rebase --continue
git push origin fix-author
Příkazy pro případ zpracování mnoha commitů se špatnými jmény a adresami:
git filter-branch --env-filter '
if [ "$GIT_COMMITTER_NAME" = "charlie" ];
then
GIT_COMMITTER_NAME="Charlie";
GIT_AUTHOR_NAME="Charlie";
GIT_COMMITTER_EMAIL="[email protected]";
GIT_AUTHOR_EMAIL="[email protected]";
fi' HEAD
Postup:
- chceme mít repozitář tak, aby větev master neobsahovala commity
ical
, a větev dev, která bude z masteru vycházet a tyto 3 commity bude obsahovat - nejdříve jsem si tedy vytvořil větev
dev
vycházející zfix-author
- použil jsem rebase před první
ical
commit, abych mohlical
commity přesunout nahoru (těmto commitům jsem zachoval pořadí) - v tomto místě jsem nyní vytvořil větev
master
- protože ve větvi master tyto 3 commity nechceme, použil jsem reset na commit
4cdfac9
, který byl před těmitoical
commity
Použité příkazy:
git checkout -b dev
git rebase -i 8b3a4a2^
git checkout -b master
git reset --hard 4cdfac9
git push origin master
git push origin dev:dev
Postup:
- pokud chceme, aby git spustil hook skript před pushnutím, tak k tomu slouží hook
pre-push
- v tomto skriptu spustím oba testy a pokud jejich návratová hodnota není 0, skript vrátí 1, což zabrání pushnutí
Cesta k souboru v adresáři .git
: hooks/pre-push
Návrh obsahu souboru:
(cd ../../src/image_histogram/test; sh test.sh)
if [ $? -ne 0 ]
then
exit 1
fi
(cd ../../src/ical_peek/test; sh test.sh)
if [ $? -ne 0 ]
then
exit 1
fi
exit 0