166 Stimmen

Wie referenziert man die ursprüngliche Übertragung?

Ich habe ein Skript, das auf die erste Übergabe in einem Repository verweisen muss. git hat den speziellen Verweis HEAD aber nicht über die entsprechende TAIL . Ich kann nichts finden in git help rev-parse die mir zu helfen scheinen.

Ich würde gerne Folgendes tun:

git show TAIL

Hier ist eine Möglichkeit, die ich habe:

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

Das ist ziemlich hakelig und hängt davon ab, dass sich die Ausgabe von git log nicht ändert.

Im Moment markiere ich nur den ersten Commit und verwende ihn als Referenz. Allerdings möchte ich ein allgemeines Werkzeug zu veröffentlichen, so dass das nicht eine große Option ist.

186voto

Jakub Narębski Punkte 286531

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

Es gibt ein zusätzliches Problem mit Ihrer Frage: Es kann geben mehr als eine eine solche TAIL Root Commit (elternlose Commit) in einem Repository (auch wenn wir unverbundene Zweige wie 'html', 'man' und 'todo' im git.git Repository außer Acht lassen). Dies ist in der Regel das Ergebnis der Zusammenführung getrennter Projekte in einem Projekt oder der Verwendung der Zusammenführung von Teilbäumen getrennt entwickelter Unterprojekte.

Zum Beispiel hat das Git Repository 6 Root Commits: git-gui, gitk (subtree-merged), gitweb (merged in, nicht mehr separat entwickelt), git mail tools (merged very early in der Projektgeschichte), und p4-fast-export (vielleicht zufällig). Nicht mitgezählt sind die Wurzeln der 'html- und 'man'-Zweige, die "convenience"-Zweige, die vorgenerierte Dokumentation enthalten, und der 'todo'-Zweig mit der TODO-Liste und Skripten.


Wenn Sie git 1.7.4.2 oder eine neuere Version haben, können Sie die --max-parents Option:

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

Andernfalls können Sie eine Liste aller elternlosen (Root) Commits erhalten, die vom aktuellen Zweig aus zugänglich sind:

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

44voto

Robert Munteanu Punkte 64955

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

13voto

Clay Bridges Punkte 11070

Ich bin mir nicht sicher, was du hier versuchst, aber einige Git-Befehle benötigen --root als Option, um auf die Wurzel des Commit-Baums zu verweisen, z. B.

git rebase --interactive --root main

7voto

abh Punkte 31

Angenommen, der erste Elternteil einer Verschmelzung ist die Hauptlinie der Entwicklung:

git rev-list --reverse --topo-order --first-parent HEAD | sed 1q

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X