2015-09-23 5 views
5

Ich habe ein Skript für ein großes Projekt, zehn Repositories, um Filialen (lokal, remote oder Tags) zu überprüfen und schließlich anzuzeigen, wo jeder der aktuelle Zweig in jedem Repository ist.Das neueste Tag in einem Commit mit mehreren Tags anzeigen

Ich verwende git branch um anzuzeigen, welcher Zweig oder Tag im aktuellen Repository ausgecheckt ist. Dies funktioniert in den meisten Fällen gut, außer wenn in demselben Commit mehrere Tags vorhanden sind, was dazu führt, dass ein zufälliges Tag der Einsen in diesem Commit gedruckt wird.

Wie kann ich das beheben? Sollte ich es anders umsetzen?

Beispiel

for repo in ... 
do 
    cd repo 
    git checkout $1 || git checkout $2 || git checkout $3 .... 
    git branch ##(to verify what happened) 
done 

lässt also sagen, dass ich laufen ./checkoutAll feat1 origin/feat1 tags/ALL7 aber ALL7-Tag ist in der gleichen mit ALL6 begehen, git branch zeigt die ALL6 statt ALL7, dass ich speziell zur Kasse gebeten.

EDIT: Das Bild unten ist die Menschen zu helfen versucht, mir zu helfen,

enter image description here

Also, sagen wir, ich git checkout tags/V9.00.00.ALL.04 dann git branch zeigt ein zufälliges Tag (* detached from ..) von denen, ausführen, existieren, 7 in diesem Beispiel. Gibt es eine Möglichkeit, die neuesten anzuzeigen? oder zumindest die anzeigen, die ich zur Kasse gebeten habe (auch wenn die ALL7 mit ALL9 identisch ist)?

Antwort

3

Es ist nicht klar, wo Sie diese Tags anzeigen möchten, aber lassen Sie mich versuchen, Ihnen zu helfen.

Lassen Sie uns zunächst die neueste Hash-Wert des aktuellen Zweig begehen finden:

git rev-parse HEAD 

Dann lassen Sie uns alle Tags finden:

git show-ref --tags --dereference 

Nun, da wir beide haben, können wir sie zu drucken bieten kann Zeige, was du verlangst. Zum Beispiel:

SHA_HEAD=$(git rev-parse HEAD) 
ALL_TAGS=$(git show-ref --tags --dereference) 
echo "$ALL_TAGS" | awk '/'$SHA_HEAD' refs\/tags\// { print $2 }' | tr '\n' ' ' 

Oder in einem Einzeiler:

git show-ref --tags --dereference | awk '/'$(git rev-parse HEAD)' refs\/tags\// { print $2 }' | tr '\n' ' ' 
+0

Natürlich wird dies nur Show-Tags, die wurden für das aktuelle Commit erstellt. Ich bin mir nicht sicher, ob OP das will. – jweyrich

+0

Wow, das ist großartig, ich habe die Frage bearbeitet, bevor ich deine Antwort ausgearbeitet habe. – thahgr

1

Nein, es gibt keinen Weg: Git hat nicht immer die Vorstellung, dass du auf einem Ast bist; Wenn Sie einen einzelnen Commit auschecken, z. Wenn du ein Tag aussuchst, bist du nicht auf einem Zweig und daher kann git dir nicht sagen, auf welchem ​​Zweig du bist.

Soweit ich weiß, sollte git-Zweig immer den Namen Ihres aktuellen Zweigs drucken, wenn Sie auf einem sind.

2

Wenn Sie einen Tag überprüfen, werden Sie in der Regel mit einer "Headless" Kasse am Ende, und git branch werden sagen:

Wenn Sie wissen möchten, in welchem ​​Zweig dieses Tag "on" ist, können Sie überprüfen, ob Ihr getaggtes Ref ein Vorfahre von Zweigen ist, die Ihrem Repo bekannt sind.Verwenden

$ git branch --contains TAG # (or HEAD) 

Sie erhalten in der Regel mehrere Kandidaten, da eine beliebige Anzahl von Zweigen erstellt worden sein könnte, nachdem das Tag platziert wurde. Es liegt an Ihnen zu entscheiden, welcher der "Zweig" ist.

Wenn Sie alle Tags an Ihrem aktuellen Kasse ref, Verwendung Hinweis zu sehen:

$ git tag --points-at TAG # (or HEAD) 

alle symbolischen Refs zu sehen, verwenden Sie

$ git log --oneline --decorate -1