Ich möchte (vorerst) die Möglichkeit behalten, Git-Änderungssätze mit in TFS gespeicherten Workitems zu verknüpfen.
Ich habe bereits ein Tool geschrieben (mit einem Hook von Git), mit dem ich Workitemidentifier in die Nachricht eines Git-Änderungssatzes einfügen kann.
Ich möchte jedoch auch die Kennung des Git-Commits (den Hash) in einem benutzerdefinierten TFS-Workitem-Feld speichern. Auf diese Weise kann ich ein Workitem in TFS untersuchen und feststellen, welche Git-Änderungssätze dem Workitem zugeordnet sind.
Wie kann ich den Hash einfach aus dem aktuellen Commit von Git abrufen?
quelle
--verify
impliziert, dass:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
git rev-parse --short HEAD
Gibt die Kurzversion des Hash zurück, nur für den Fall, dass sich jemand wundert.--short
, wie--short=12
eine bestimmte Anzahl von Stellen aus dem Hash zu bekommen.--short=N
ist ungefähr minimale Anzahl von Ziffern; git verwendet eine größere Anzahl von Ziffern, wenn eine verkürzte nicht von einer verkürzten anderen Festschreibung zu unterscheiden wäre. Versuchen Sie es zBgit rev-parse --short=2 HEAD
odergit log --oneline --abbrev=2
.git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
Wenn Sie nur den verkürzten Hash möchten:
Darüber hinaus ist die Verwendung von% H ein weiterer Weg, um den langen Hash zu erhalten.
quelle
git log
ist Porzellan undgit rev-parse
ist Sanitär.git checkout 33aa44; git log -n 1
gibt mir33aa44
. Welche Version von Git verwenden Sie?Eine andere, die Git Log verwendet:
Es ist dem von @outofculture sehr ähnlich, wenn auch etwas kürzer.
quelle
HEAD
.HEAD
auf dieses Commit verwiesen und nicht auf einen benannten Zweig, der als losgelöster Kopf bezeichnet wird .Um die volle SHA zu erhalten:
So erhalten Sie die verkürzte Version:
quelle
git
commit
Hashes benötigt werden, z. B. einer von dembranch
, mit dem Sie gerade arbeiten, und amaster
branch
, können Sie ihn auch verwenden,git rev-parse FETCH_HEAD
wenn Sie den Hash für den benötigen, denmaster
commit
Siemerge
in Ihre aktuelle Version eingegeben habenbranch
. zB wenn Siebranch
esmaster
undfeature/new-feature
für ein bestimmtes Repo haben, währendfeature/new-feature
Sie es verwenden könntengit fetch origin master && git merge FETCH_HEAD
und dann,git rev-parse --short FETCH_HEAD
wenn Sie dencommit
Hash von dem benötigen, denmaster
Sie gerademerge
für alle Skripte eingegeben haben, die Sie möglicherweise haben.Der Vollständigkeit halber, da noch niemand darauf hingewiesen hat.
.git/refs/heads/master
ist eine Datei, die nur eine Zeile enthält: den Hash des letzten Commitsmaster
. Sie können es also einfach von dort aus lesen.Oder als Befehl:
Aktualisieren:
Beachten Sie, dass git jetzt das Speichern einiger Head-Refs in der Pack-Ref-Datei anstatt als Datei im Ordner / refs / Heads / unterstützt. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
quelle
master
, was nicht unbedingt wahr ist.master
..git/HEAD
Zeigt normalerweise auf einen Schiedsrichter. Wenn Sie einen SHA1 darin haben, befinden Sie sich im Modus mit losgelöstem Kopf..git
Unterverzeichnis gibt, was nicht unbedingt der Fall ist. Siehe die--separate-git-dir
Flagge in dergit init
Manpage.Hash festlegen
Abgekürzter Commit-Hash
Klicken Sie hier für weitere
git show
Beispiele.quelle
Das gibt es immer
git describe
auch. Standardmäßig gibt es Ihnen -quelle
git describe --long --dirty --abbrev=10 --tags
es, wenn ich7.2.0.Final-447-g65bf4ef2d4
nach dem 7.2.0.Final-Tag 447 Commits bekomme und die ersten 10 Digests des globalen SHA-1 am aktuellen HEAD "65bf4ef2d4" sind. Dies ist sehr gut für Versionszeichenfolgen. Mit --long werden immer die Anzahl (-0-) und der Hash hinzugefügt, auch wenn das Tag genau übereinstimmt.git describe --always
wird "eindeutig abgekürztes Festschreibungsobjekt als Fallback angezeigt"git describe --tags --first-parent --abbrev=11 --long --dirty --always
. Die--always
Option bedeutet, dass ein Ergebnis (Hash) bereitgestellt wird, auch wenn keine Tags vorhanden sind. Dies--first-parent
bedeutet, dass es nicht durch Zusammenführungs-Commits verwirrt wird und nur Elementen im aktuellen Zweig folgt. Beachten Sie auch, dass dies an das Ergebnis--dirty
angehängt wird-dirty
, wenn der aktuelle Zweig nicht festgeschriebene Änderungen aufweist.Verwenden
git rev-list --max-count=1 HEAD
quelle
Wenn Sie den Hash während eines Skripts in einer Variablen speichern müssen, können Sie ihn verwenden
Oder wenn Sie nur die ersten 10 Zeichen möchten (wie es github.com tut)
quelle
--short
oder--short=number
Parameter zugit rev-parse
; keine Notwendigkeit, ein Rohr zu verwenden undcut
.Wenn Sie den super-hackigen Weg wollen, es zu tun:
Grundsätzlich speichert git die Position von HEAD in .git / HEAD in der Form
ref: {path from .git}
. Dieser Befehl liest das aus, schneidet das "ref:" ab und liest die Datei aus, auf die er zeigt.Dies wird natürlich im Modus mit losgelöstem Kopf fehlschlagen, da HEAD nicht "ref: ..." ist, sondern der Hash selbst - aber Sie wissen, ich glaube nicht, dass Sie so viel Intelligenz in Ihrem Bash erwarten -Liner. Wenn Sie nicht glauben, dass Semikolons schummeln ...
quelle
sh
. Eine halbe Stunde Dokumentationskommentare später, und hier ist eine Zusammenfassung: gist.github.com/Fordi/29b8d6d1ef1662b306bfc2bd99151b07Der prägnanteste Weg, den ich kenne:
Wenn Sie eine bestimmte Anzahl von Ziffern des Hashs möchten, können Sie Folgendes hinzufügen:
quelle
git show
wird jedoch als Porzellanbefehl bezeichnet (dh dem Benutzer zugewandt) und sollte daher nicht in Skripten verwendet werden, da sich die Ausgabe ändern kann. Die Antwort oben (git rev-parse --short HEAD
) sollte stattdessen verwendet werden.git help show
nachporcelain
.--porcelain
, weshalb dies verwirrend ist. Sie können die Details in dieser großartigen Antwort von VonC findenVielleicht möchten Sie einen Alias, damit Sie sich nicht an alle raffinierten Details erinnern müssen. Nachdem Sie einen der folgenden Schritte ausgeführt haben, können Sie einfach Folgendes eingeben:
Nach der akzeptierten Antwort gibt es zwei Möglichkeiten, dies einzurichten:
1) Lehren Sie Git auf explizite Weise, indem Sie die globale Konfiguration bearbeiten (meine ursprüngliche Antwort):
2) Oder wenn Sie eine Verknüpfung möchten, um Git eine Verknüpfung beizubringen, wie kürzlich von Adrien kommentiert:
Verwenden Sie ab hier,
git lastcommit
um den Hash des letzten Commits anzuzeigen.quelle
git config --global alias.lastcommit "rev-parse HEAD"
Ich brauchte etwas anderes: Zeigen Sie den vollständigen sha1 des Commits an, aber fügen Sie am Ende ein Sternchen hinzu, wenn das Arbeitsverzeichnis nicht sauber ist. Sofern ich nicht mehrere Befehle verwenden wollte, funktioniert keine der Optionen in den vorherigen Antworten.
Hier ist der eine Liner, der dies tut:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Ergebnis:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
Erläuterung: Beschreibt (unter Verwendung von mit Anmerkungen versehenen Tags) das aktuelle Commit, jedoch nur mit Tags, die "NOT A TAG" enthalten. Da Tags keine Leerzeichen enthalten können, stimmt dies nie mit einem Tag überein. Da ein Ergebnis angezeigt werden soll
--always
, wird der Befehl mit der vollständigen (--abbrev=0
) sha1 des Commits zurückgesetzt und ein Sternchen angehängt, wenn sich das Arbeitsverzeichnis befindet--dirty
.Wenn Sie das Sternchen nicht anhängen möchten, funktioniert dies wie alle anderen Befehle in den vorherigen Antworten:
git describe --always --abbrev=0 --match "NOT A TAG"
Ergebnis:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
quelle
--match "NOT A TAG"
. Getestet in Git 2.18.0 sowie 2.7.4. Gibt es eine Situation, in der dieses Argument benötigt wird?Wenn Sie jedoch Geschwindigkeit anstreben , ist dies der von Deestan erwähnte Ansatz
ist deutlich schneller als jede andere hier aufgeführte Methode.
quelle
show-ref
Mir scheint die beste Option für Scripting zu sein, da es sich um ein Sanitär - Befehl und damit garantiert (oder zumindest sehr wahrscheinlich) ist stabil in zukünftigen Versionen bleiben: andere Antworten verwendenrev-parse
,show
,describe
, oderlog
, die alle Porzellan - Befehle sind. In Fällen, in denen Geschwindigkeit nicht von entscheidender Bedeutung ist, gilt der Hinweis auf dershow-ref
Manpage: "Die Verwendung dieses Dienstprogramms wird empfohlen, um direkt auf Dateien im Verzeichnis .git zuzugreifen."Hier ist ein Einzeiler in der Bash-Shell, der direkt aus Git-Dateien liest:
Sie müssen den obigen Befehl in Ihrem Git-Stammordner ausführen.
Diese Methode kann nützlich sein, wenn Sie Repository-Dateien haben, der
git
Befehl jedoch nicht installiert wurde.Wenn dies nicht funktioniert, überprüfen Sie im
.git/refs/heads
Ordner, welche Art von Köpfen Sie haben.quelle
Fügen Sie in Ihrem Home-Verzeichnis in der Datei ".gitconfig" Folgendes hinzu
dann haben Sie einen leichteren Befehl, an den Sie sich erinnern können:
quelle
Führen Sie bei git bash einfach $ git log -1 aus
Sie werden sehen, diese Zeilen folgen Ihrem Befehl.
quelle
Hier ist eine weitere Implementierung mit direktem Zugriff:
Dies funktioniert auch über http, was für lokale Paketarchive nützlich ist (ich weiß: Für öffentliche Websites wird nicht empfohlen, das Verzeichnis .git zugänglich zu machen):
quelle
Hier ist eine andere Möglichkeit, dies zu tun :)
quelle
Beispielausgabe:
ref: refs/heads/master
Analysieren Sie es:
cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"
Wenn Sie Windows haben, können Sie wsl.exe verwenden:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"
Ausgabe:
refs/heads/master
Dieser Wert kann später zum Auschecken verwendet werden, zeigt jedoch auf seine SHA. Um es so zu machen, dass es auf den aktuellen Zweig mit seinem Namen verweist, gehen Sie wie folgt vor:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"
Ausgänge:
master
quelle