Wie verweise ich auf das anfängliche Commit?

131

Ich habe ein Skript, das auf das anfängliche Commit in einem Repository verweisen muss. git hat die spezielle Referenz HEAD, aber nicht die entsprechende TAIL. Ich kann nichts finden, was git help rev-parsemir zu helfen scheint.

Folgendes möchte ich tun:

git show TAIL

Hier ist eine Option, die ich habe:

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

Das ist ziemlich hackig und hängt davon ab, dass sich die Ausgabe des Git-Protokolls nicht ändert.

Im Moment tagge ich einfach das anfängliche Commit und verwende es als meine Referenz. Ich möchte jedoch ein allgemeines Tool veröffentlichen, daher ist dies keine gute Option.

Bryan Larsen
quelle

Antworten:

150

Verwenden Sie git-log nicht für Skripte: Verwenden Sie entweder git-rev-listoder git-logmit dem angegebenen benutzerdefinierten Format ( --format=*<sth>*Option).

Es gibt ein zusätzliches Problem mit Ihrer Frage: Es kann mehr als ein solches TAIL-Root-Commit (übergeordnetes Commit) in einem Repository geben (selbst wenn getrennte Zweige wie 'html', 'man' und 'todo' in git.git nicht berücksichtigt werden Repository). Dies ist normalerweise das Ergebnis der Verknüpfung separater Projekte in einem oder der Zusammenführung von Teilbäumen eines separat entwickelten Teilprojekts.

Das Git-Repository verfügt beispielsweise über 6 Root-Commits: Git-GUI, Gitk (Teilbaum zusammengeführt), Gitweb (zusammengeführt, nicht mehr separat entwickelt), Git-Mail-Tools (sehr früh in der Projektgeschichte zusammengeführt) und p4-Fast-Export ( vielleicht versehentlich). Dies gilt nicht für die Wurzeln von "HTML" - und "Man" -Zweigen, "Convenience" -Zweigen, die vorgenerierte Dokumentation enthalten, und "ToDo" -Zweigen mit TODO-Liste und -Skripten.


Wenn Sie Git 1.7.4.2 oder neuer haben, können Sie die --max-parentsOption verwenden:

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

Andernfalls können Sie eine Liste aller übergeordneten (Root-) Commits abrufen, auf die vom aktuellen Zweig aus zugegriffen werden kann, indem Sie:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Jakub Narębski
quelle
Für mich geben die git rev-list HEAD | tail -n 1und git rev-list --max-parents=0 HEADnicht den gleichen Hashwert für mich zurück. Derjenige, der das verwendet, --max-parents=0erhält tatsächlich das anfängliche Commit. Ich dachte nur, ich würde darauf hinweisen, dass Letzteres zuverlässiger erscheint.
Jbranchaud
1
@Treebranch Dies kann passieren, wenn Sie Commits mit ungeraden Zeitstempeln haben. Hinzufügen --topo-orderzu dem rev-listsollte das beheben, obwohl ich denke, die --max=parents=0Antwort ist am besten.
Bis
35

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

Robert Munteanu
quelle
14
Dies würde einen der Tail Commits zurückgeben; Es kann mehr als ein Root-Commit
Eltern
Diese Antwort funktionierte perfekt und gab nur ein Commit zurück, während git rev-list --max-parents=0 HEAD3 Commits zurückgegeben wurden.
Protoevangelion
tail ist auch kein Befehl, der standardmäßig in Windows vorhanden ist - funktioniert jedoch in GitBash unter Windows. :)
Johny Skovdal