2009-06-17 14 views
92

Ich habe ein Skript, das auf das initiale Commit in einem Repository verweisen muss. git hat die spezielle Referenz HEAD, hat aber nicht die entsprechende TAIL. Ich kann nichts in git help rev-parse finden, das scheint mir zu helfen.Wie wird auf das initiale Commit verwiesen?

Hier ist, was Ich mag würde tun:

git show TAIL 

Hier ist eine Option Ich habe:

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

Das ziemlich hacky ist und hängt von der Ausgabe von git log nicht ändern.

Im Moment markiere ich einfach das erste Commit und benutze das als meine Refspec. Allerdings würde ich gerne ein allgemeines Tool veröffentlichen, also ist das keine gute Option.

Antwort

110

Sie für Skripting nicht verwenden git-log: entweder git-rev-Liste verwenden oder git-log mit dem angegebenen benutzerdefinierten Format ("--format = <sth>" Option).

Es gibt zusätzliches Problem mit Ihrer Frage: Es kann existiert mehr als ein solche TAIL root commit (elternlos Festschreibung) in einem Repository (auch wenn wir getrennte Zweige diskontieren, wie ‚html‘, ‚Mensch‘ und " todo 'in git.git repository). Dies ist in der Regel das Ergebnis der Verbindung separater Projekte in einem oder der Verwendung von Teilbaum-Merge eines separat entwickelten Teilprojekts.

Zum Beispiel hat git repository 6 root-commits: git-gui, gitk (teilbaumzusammengeführt), gitweb (zusammengeführt, nicht mehr separat entwickelt), git mail tools (sehr früh in der Projekthistorie zusammengeführt) und p4- schneller Export (vielleicht zufällig). Das zählt nicht die Wurzeln von 'html und' man 'Zweigen, "Convenience" Zweigen, die vorgenerierte Dokumentation enthalten, und' todo 'Zweig mit TODO Liste und Skripten.


Sie können die Liste aller elternlos (root) erhalten begeht zugänglich von Stromzweig mit:

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

Wenn Sie 1.7.4.2 oder neuer git haben, können Sie die neue --max-parents Option:

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

Keine rohre, alle wurzeln: 'git rev-list --max-eltern = 0 KOPF' – wowest

+3

@wowest: IIRC gab es keine' --max-eltern' option wenn ich schrieb diese Antwort. Thansk für das Update! –

+0

Für mich ist die 'git rev-list HEAD | tail -n 1' und 'git rev-list -max-eltern = 0 HEAD' geben nicht denselben Hash-Wert für mich zurück. Derjenige, der '--max-eltern = 0 'verwendet, erhält tatsächlich den anfänglichen Commit. Ich dachte nur, dass letzteres zuverlässiger erscheint. – jbranchaud

21

git rev-list HEAD | tail -n 1 ist eine stabilere Option.

+8

Dies würde * one * Schwanz commits zurückgeben; es kann mehr als ein root (elternloses) commit geben –

Verwandte Themen