Jak odwołać się do początkowego zatwierdzenia?

131

Mam skrypt, który musi odwoływać się do początkowego zatwierdzenia w repozytorium. git ma specjalne odwołanie HEAD, ale nie ma odpowiedniego TAIL. Nie mogę znaleźć niczego, git help rev-parseco mogłoby mi pomóc.

Oto, co chciałbym zrobić:

git show TAIL

Oto jedna opcja, którą mam:

git show `git log --reverse | if read a commit ; then echo $commit ; fi`

To dość hakerskie i zależy od tego, czy dane wyjściowe dziennika git się nie zmieniają.

W tej chwili po prostu oznaczam początkowe zatwierdzenie i używam go jako mojego refspec. Chciałbym jednak wydać ogólne narzędzie, więc nie jest to świetna opcja.

Bryan Larsen
źródło

Odpowiedzi:

153

Nie używaj git-log do tworzenia skryptów: użyj albo git-rev-listlub git-logz określonym niestandardowym formatem ( --format=*<sth>*opcja).

Z Twoim pytaniem wiąże się dodatkowy problem: może istnieć więcej niż jeden takie zatwierdzenie roota TAIL (zatwierdzenie bez rodzica) w repozytorium (nawet jeśli dyskontujemy odłączone gałęzie, takie jak 'html', 'man' i 'todo' w git.git magazyn). Zwykle jest to wynikiem połączenia oddzielnych projektów w jeden lub zastosowania scalenia poddrzewo osobno opracowanego podprojektu.

Na przykład repozytorium git ma 6 zatwierdzeń roota: git-gui, gitk (połączone z poddrzewem), gitweb (scalone, nie jest już rozwijane osobno), narzędzia git mail (scalone bardzo wcześnie w historii projektu) i p4-fast-export ( być może przypadkowe). Nie licząc korzeni gałęzi „html i„ man ”, gałęzi„ wygodnych ”, które zawierają wstępnie wygenerowaną dokumentację oraz gałęzi„ todo ”z listą zadań do wykonania i skryptami.


Jeśli masz git 1.7.4.2 lub nowszy, możesz skorzystać z --max-parentsopcji:

$ git rev-list --max-parents=0 HEAD

W przeciwnym razie możesz uzyskać listę wszystkich zatwierdzeń bez rodzica (root) dostępnych z bieżącej gałęzi za pomocą:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Jakub Narębski
źródło
Dla mnie git rev-list HEAD | tail -n 1i git rev-list --max-parents=0 HEADnie zwracają tej samej wartości skrótu. Ten, który używa the, --max-parents=0w rzeczywistości otrzymuje początkowe zatwierdzenie. Pomyślałem, że wskażę, że to drugie wydaje się bardziej niezawodne.
jbranchaud
1
@Treebranch może się to zdarzyć, jeśli masz zmiany z nieparzystymi sygnaturami czasowymi. dodanie --topo-orderdo tego rev-listpowinno to naprawić, chociaż myślę, że --max=parents=0odpowiedź jest najlepsza.
jthill
35

git rev-list HEAD | tail -n 1 jest bardziej stabilną opcją.

Robert Munteanu
źródło
15
To zwróci jedno z zatwierdzeń ogona; może być więcej niż jedno zatwierdzenie root (bez rodzica)
Jakub Narębski
Ta odpowiedź zadziałała doskonale i zwróciła tylko jedno zatwierdzenie sha, podczas gdy git rev-list --max-parents=0 HEADzwróciła 3 zatwierdzenia.
protoEvangelion
tail nie jest również poleceniem, które jest domyślnie dostępne w systemie Windows - działa jednak w GitBash w systemie Windows. :)
Johny Skovdal
2

Nie jestem pewien, co próbujesz tutaj zrobić, ale niektóre polecenia git przyjmują --rootopcję, aby odwołać się do katalogu głównego drzewa zatwierdzeń, np.

git rebase --interactive --root main
Clay Bridges
źródło