2010-10-21 6 views
37

Gibt es eine Möglichkeit, das parent-Commit tatsächlich auszuchecken, um die SHA-1-Commit-ID eines Submoduls basierend auf einer Commit-ID im übergeordneten Klon zu ermitteln? Ich weiß, dass ich den derzeit verbundenen SHA-1 mit 'git Submodul' finden kann.Wie kann ich die zugehörige Commit-ID eines Git-Submoduls aus einem früheren Commit im Elternklon erhalten?

Hier ist ein Beispiel: Ich habe einen Klon mit einem einzigen Submodul 'foo', das sich im letzten Monat mehrmals geändert hat. Ich habe ein Tag in dem Eltern-Klon, der ein paar Wochen alt ist, genannt "released-1.2.3". Ich möchte herausfinden, was die zugehörige SHA-1 von 'foo' für dieses getaggte Commit war. Ich könnte einfach 'released-1.2.3' auschecken und git-submodule verwenden, um zu sehen, aber ich frage mich, ob es einen Weg gibt, dies zu tun, ohne den Arbeitsbaum zu beeinflussen, da ich ihn skripten möchte.

Ich möchte dies tun, weil ich ein Skript erstellen will, um 'Diff' auf alle Änderungen innerhalb eines Submoduls zwischen zwei Commits innerhalb des übergeordneten Repository zu machen - dh "sagen Sie mir, welche Dateien innerhalb des Submoduls 'foo' zwischen geändert diese beiden Commits im Elternteil. "

Antwort

49

Sie können git-ls-tree verwenden, um zu sehen, was die SHA-1-ID eines bestimmten Pfades während eines gegebenen war begehen:

$ git ls-tree released-1.2.3 foo 
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398 foo 

(Mein erster Gedanke war git show released-1.2.3 foo, aber das nicht mit „fatal: schlechtem Objekt“ .)

Da Sie die Ausgabe sind scripting, werden Sie wahrscheinlich nur die SHA-1-ID selbst, zum Beispiel zu bekommen:

$ git ls-tree released-1.2.3 foo | awk '{print $3}' 
c0f065504bb0e8cfa2b107e975bb9dc5a34b0398 

auch: Beim Schreiben sc um git herum, versuchen Sie, sich an die plumbing Befehle zu halten, wie im Handbuch beschrieben. Sie haben eine stabilere Schnittstelle, während die vertrauteren "Porzellan" -Befehle sich möglicherweise in unvereinbarer Weise ändern.

+0

Ich denke, das ist die Antwort, nach der ich suche - das scheint den Hash des Submoduls für das angegebene Eltern-Commit zurückzugeben. Vielen Dank. Auch, Klempner Kommentar notiert - danke. – meowsqueak

+3

Um Submodule mit ihren Hashes bei beliebigem Commit zu entdecken: 'git ls-tree - Vollbaum -r commit | grep^160000'. Das Grep ist für den Modus, der für Submodulverknüpfungen verwandt wird. –

+0

@ S.ChristofferEliesen, fügen Sie -r hinzu, um alle Submodule zu finden, nicht nur die in ./ –

2

Ich habe einen vielversprechenden Weg finden:

$ git log --raw <since>..<until> --submodule -- <path/to/submodule> 

Mit der --raw Option, diese an das zugeordneten Commits des Submodul entspricht den (abgekürzt) SHA-1-IDs nicht ausdrucken. Leider ist die Ausgabe sehr ausführlich und es wird etwas Arbeit in einem Skript benötigt.

Was ich wirklich brauche, ist eine Git-Einrichtung, die mir eine Commit-ID für Eltern gibt und mir die letzte Änderung an einem Submodul vor dem Commit gibt. I.e. welches Submodul SHA-1 'git submodule update' würde prüfen, ob ich das übergeordnete Commit tatsächlich auschecke.

+0

git log --format =% H erhalten Sie Hashes .. so wird git rev-parse –

+0

arbeiten an einer Antwort .. –

+1

Vielen Dank für Ihre Kommentare, adymitruk. Allerdings --format =% H und rev-parse gibt die Hashes für das Commit des Eltern-Klons zurück, leider nicht den tatsächlichen Hash des Submoduls. – meowsqueak

0

git slave (gits) könnte Ihre Antwort sein.

http://gitslave.sourceforge.net/

Aber Sie können dies auch mit einfachen git .. es nicht so einfach ist.

+0

wieder bearbeitet als SO Parser war ein Teil meiner Antwort essen .. –

3

Dies ist für mich gearbeitet:

$ git rev-parse released-1.2.3^{commit}:foo 
<SHA1> 

Vielleicht auch ganz einfach in Skript zu verwenden.

+0

Ich war überrascht zu sehen, dass 'rev-parse' das Submodul verstand. –

Verwandte Themen