Ich habe ein paar nicht notierte Tags im Repository und möchte herausfinden, auf welche Commit sie verweisen. Gibt es einen Befehl, der nur die Tags und die zugehörigen SHAs auflistet? Das Auschecken des Tags und das Betrachten des HEAD erscheint mir etwas zu mühsam.
Nachdem ich die Antworten durchgegangen war, wurde mir klar, dass ich eigentlich nur die Geschichte betrachten wollte, die zum Tag führte, für das git log <tagname>
ausreicht.
Die Antwort, die als Antwort markiert ist, ist hilfreich, um eine Liste der Tags und ihrer Commits zu erhalten. Mit etwas Shell-Hacker ist es sicher möglich, diese in SHA + Commit-Nachricht umzuwandeln.
Eine Möglichkeit, dies zu tun, wäre mit git rev-list
. Das Folgende gibt das Commit aus, auf das ein Tag zeigt:
$ git rev-list -n 1 $TAG
Sie könnten es als Alias in ~/.gitconfig
hinzufügen, wenn Sie es häufig verwenden:
[alias]
tagcommit = rev-list -n 1
Und dann rufen Sie es an mit:
$ git tagcommit $TAG
git show-ref --tags
Zum Beispiel zeigt git show-ref --abbrev=7 --tags
etwas wie das Folgende:
f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2
Verwenden Sie einfach git show <tag>
Es gibt jedoch auch Dumps ab. Verwenden Sie git log -1 <tag>
, um diese Unterschiede wegzulassen. (Danke an @DolphinDream und @demisx!)
In meinem Repository zeigt git show-ref TAG
den Hash des Tags, nicht den Hash des Commits, auf den er verweist.
git show-ref --dereference TAG
zeigt zusätzlich das Commit, auf das gezeigt wird.
Benutzen
git rev-parse --verify <tag>^{commit}
(Dies würde SHA-1 eines Commits auch für das kommentierte Tag zurückgeben).
git show-ref <tag>
würde auch funktionieren, wenn <tag>
nicht kommentiert wird. Und es gibt immer git for-each-ref
(siehe Dokumentation für Details).
Von Igor Zevaka :
Da es ungefähr vier annähernd gleichermaßen akzeptable, aber unterschiedliche Antworten gibt, werde ich die verschiedenen Möglichkeiten eines Skin-Tags zusammenfassen.
git rev-list -1 $TAG
( antwort ). git rev-list
gibt die Commits aus, die zum $TAG
ähnlich wie git log
führen, aber nur die SHA1 des Commits zeigen. Der -1
beschränkt die Ausgabe auf das Commit, auf das er zeigt.
git show-ref --tags
( answer ) zeigt alle Tags (lokal und aus der Ferne abgerufen) und ihre SHA1 an.
git show-ref $TAG
( answer ) zeigt das Tag und seinen Pfad zusammen mit dem SHA1 an.
git rev-parse $TAG
( answer ) zeigt den SHA1 eines nicht notierten Tags.
git rev-parse --verify $TAG^{commit}
( answer ) zeigt eine SHA1 von kommentierten und nicht notierten Tags. Unter Windows verwenden Sie git rev-parse --verify %TAG%^^^^{commit}
(vier Hüte).
cat .git/refs/tags/*
oder cat .git/packed-refs
( answer ), abhängig davon, ob das Tag lokal ist oder nicht.
Wie wäre es damit:
git log -1 $TAGNAME
ODER
git log -1 Origin/$TAGNAME
Um den sha/hash des Commits zu erhalten, auf das sich ein Tag bezieht (nicht das sha des Tags):
git rev-list -1 <tag>
Ich würde auch gerne den "richtigen" Weg wissen, aber in der Zwischenzeit können Sie dies tun:
git show mytag | head -1
Obwohl dies ziemlich alt ist, dachte ich, ich würde auf ein cooles Feature hinweisen, das ich gerade für das Auflisten von Tags mit Commits gefunden habe:
git log --decorate=full
Es werden die Zweige angezeigt, die mit einem Commit enden/beginnen, und die Tags für Commits.
Sie könnten auch ein besser verständliches Bild davon erhalten, wo Tags auf die Verwendung hindeuten
git log --graph |git name-rev --stdin --tags |less
und scrollen Sie dann mit /
zu dem Tag, den Sie suchen.
Eine kompaktere Ansicht (--pretty=oneline
) plus alle Köpfe (-a
) könnte ebenfalls helfen:
git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Sieht ein wenig beängstigend aus, könnte aber bei Bedarf auch in ~/.gitconfig
verfälscht sein.
~/.gitconfig
[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Dadurch erhalten Sie den aktuellen SHA1-Hash
Abkürzter Commit Hash
git show <tag> --format="%h" --> 42e646e
Commit Hash
git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
ich möchte auch den richtigen Weg wissen, aber Sie können immer einen Blick auf Folgendes werfen:
$ cat .git/packed-refs
oder:
$ cat .git/refs/tags/*
Wenn Sie die Details des Tags SOMETAG (Tagger, Date usw.) sehen möchten, den Hash des Commits, auf den er zeigt, und ein paar Informationen zum Commit, jedoch ohne den vollständigen Unterschied, versuchen Sie es
git show --name-status SOMETAG
Beispielausgabe:
tag SOMETAG
Tagger: ....
Date: Thu Jan 26 17:40:53 2017 +0100
.... tag message .......
commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date: Thu Jan 26 17:38:35 2017 +0100
.... commit message .......
..... list of changed files with their change-status (like git log --name-status) .....
Von git Mailingliste erhalten Sie die Liste der Commit-Hashes für Tags mit automatischer Dereferenzierung für kommentierte Tags:
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
Dies zeigt nicht die Dateinamen an, aber zumindest bekommt man ein Gefühl für das Repository.
cat .git/refs/tags/*
Jede Datei in diesem Verzeichnis enthält ein Commit SHA, das auf ein Commit verweist.
Ich habe also eine Menge von Release-Ordnern, in denen diese Ordner aus einem von einigen verschiedenen Repos ausgecheckt werden können. Sie können dev-, qa- oder master-Zweige sein oder Produktionsversionen sein, die von einem Tag ausgecheckt werden, und der Tag kann sein kommentiert oder nicht. Ich habe ein Skript, das den Zielordner betrachtet und eine Antwort in der Form zurückbekommt -. Das Problem ist, dass verschiedene Versionen von git einen anderen Status für eine Tag-Überprüfung zurückgeben.
Also fand ich git show-ref --tags
anfangs abgesehen von den kommentierten Tags. Durch Hinzufügen von -d wurde der Liste der Tags jedoch ein separater Eintrag hinzugefügt, einer für den Tag und der andere für die Annotation (das Annotation-Commit wurde als ^ {} identifiziert, das ich mit sed entfernt habe).
Dies ist also der Kern meines Skripts für jeden, der es will: -
REPO=`git --git-dir=${TARGET} remote show Origin -n | \
grep "Fetch URL:" | \
sed -E "s/^.*\/(.*)$/\1/" | \
sed "s/.git$//"`
TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
cut -d\ -f2 | \
cut -d/ -f3 | \
sed "s/\^{}$//"`
if [ "${TAG}" == "" ] ; then
BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
cut -d\ -f2 | \
cut -d/ -f3`
TAG=${BRANCH}
fi
Kann unten verwenden, es wird der Festschreibungshash gebengit show -s --format=%H <tag>^{commit}
Wenn abgekürzter Commit-Hash erforderlich ist, git show -s --format=%h <tag>^{commit}