Come fare riferimento al commit iniziale?


131

Ho uno script che deve fare riferimento al commit iniziale in un repository. git ha il riferimento speciale HEAD, ma non ha il corrispondente TAIL. Non riesco a trovare nulla git help rev-parseche possa aiutarmi.

Ecco cosa mi piacerebbe fare:

git show TAIL

Ecco un'opzione che ho:

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

È piuttosto confuso e dipende dal fatto che l'output del registro git non cambi.

In questo momento taggo semplicemente il commit iniziale e lo uso come refspec. Tuttavia, vorrei rilasciare uno strumento generale, quindi non è un'ottima opzione.

Risposte:


151

Non usare git-log per gli script: usare uno git-rev-listo git-logcon il formato personalizzato specificato ( --format=*<sth>*opzione).

C'è un ulteriore problema con la tua domanda: può esistere più di un tale commit root TAIL (commit parentless) in un repository (anche se scartiamo i rami disconnessi, come 'html', 'man' e 'todo' in git.git repository). Questo di solito è il risultato dell'unione di progetti separati in uno o usando l'unione di sottostrutture di sottoprogetti sviluppati separatamente.

Ad esempio, il repository git ha 6 commit di root: git-gui, gitk (subtree-merged), gitweb (unito, non più sviluppato separatamente), git mail tools (unito molto presto nella storia del progetto) e p4-fast-export ( forse accidentale). Ciò non conta le radici dei rami 'html e' man ', i rami "convenienza" che contengono documentazione pre-generata e il ramo "todo" con elenco e script TODO.


Se hai git 1.7.4.2 o più recente, puoi usare l' --max-parentsopzione:

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

Altrimenti, puoi ottenere l'elenco di tutti i commit senza parent (root) accessibili dal ramo corrente usando:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

Per me, git rev-list HEAD | tail -n 1e git rev-list --max-parents=0 HEADnon stanno restituendo lo stesso valore di hash per me. In --max-parents=0realtà, quello che usa il sta ottenendo il commit iniziale. Ho solo pensato di sottolineare che quest'ultimo sembra più affidabile.
jbranchaud,

1
@Treebranch questo potrebbe accadere se hai commesso timestamp dispari. aggiungendo --topo-ordera ciò rev-listdovrebbe risolverlo, anche se penso che la --max=parents=0risposta sia la migliore.
jillill

35

git rev-list HEAD | tail -n 1 è un'opzione più stabile.


14
Ciò restituirebbe uno dei commit della coda; può esserci più di un commit root (senza genitori)
Jakub Narębski,

Questa risposta ha funzionato perfettamente e ha restituito solo un commit sha mentre ha git rev-list --max-parents=0 HEADrestituito 3 commit.
protoEvangelion,

tail non è un comando presente di default in Windows, ma funziona in GitBash su Windows. :)
Johny Skovdal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.