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.
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}$"
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.
git rev-list HEAD | tail -n 1
undgit rev-list --max-parents=0 HEAD
nicht den gleichen Hashwert für mich zurück. Derjenige, der das verwendet,--max-parents=0
erhält tatsächlich das anfängliche Commit. Ich dachte nur, ich würde darauf hinweisen, dass Letzteres zuverlässiger erscheint.--topo-order
zu demrev-list
sollte das beheben, obwohl ich denke, die--max=parents=0
Antwort ist am besten.git rev-list HEAD | tail -n 1
ist eine stabilere Option.quelle
git rev-list --max-parents=0 HEAD
3 Commits zurückgegeben wurden.