2009-06-17 21 views
92

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 in git help rev-parse che sembrerebbe aiutarmi.Come fare riferimento al commit iniziale?

Ecco quello che mi piacerebbe fare:

git show TAIL 

Ecco una possibilità che ho:

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

Questo è abbastanza hacky e dipende l'output di git log non cambiare.

In questo momento ho appena taggato il commit iniziale e lo uso come refspec. Tuttavia, mi piacerebbe rilasciare uno strumento generale, quindi non è una grande opzione.

risposta

110

Non utilizzare git-log per lo scripting: utilizzare uno git-rev-list, o git-log con formato personalizzato specificato ("--format = <qc>" l'opzione).

c'è problema supplementare con la vostra domanda: può esistere più di un come radice CODA commit (senza genitori commettere) in un repository (anche se scontiamo rami sconnessi, come ad esempio 'html', 'l'uomo' e ' todo 'nel repository git.git). Questo è in genere il risultato dell'unione di progetti separati in uno o dell'uso di sottostruttura di sottoprogetti sviluppati separatamente.

Ad esempio, git repository ha 6 commit principali: git-gui, gitk (unito a una sezione secondaria), gitweb (unito, non più sviluppato separatamente), git mail tools (unificato molto presto nella cronologia del progetto) e p4- esportazione rapida (forse accidentale). Questo non significa contare i rami 'html e' man ', i rami "convenience" che contengono la documentazione pre-generata e il ramo' todo 'con l'elenco e gli script TODO.


È possibile ottenere l'elenco di tutti senza genitori (root) commette accessibile dal ramo corrente mediante:

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

Se avete git 1.7.4.2 o più recente, è possibile utilizzare la nuova opzione --max-parents:

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

Nessun pipe, tutte le radici: 'git rev-list --max-parents = 0 HEAD' – wowest

+3

@wowest: IIRC non c'erano opzioni' --max-parents' quando I Stavo scrivendo questa risposta. Grazie per l'aggiornamento! –

+0

Per me, 'git rev-list HEAD | tail -n 1' e 'git rev-list --max-parents = 0 HEAD' non restituiscono lo stesso valore di hash per me. Quello che usa '--max-parents = 0' sta in effetti ottenendo il commit iniziale. Ho solo pensato di far notare che quest'ultimo sembra più affidabile. – jbranchaud

21

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

+8

Questo restituire * uno * di coda commette; ci può essere più di un commit root (senza parentesi) –

Problemi correlati