Sagen Sie, ob ein Git -Commit ein Zusammenschluss/Rückkehr -Commit ist
-
26-09-2019 - |
Frage
Ich schreibe ein Skript, das überprüft werden muss, ob ein bestimmtes Commit ein Merge/Revert -Commit ist oder nicht, und ich frage mich, ob es einen Git -Trick dafür gibt.
Was ich mir bisher ausgedacht habe (und ich möchte hier definitiv nicht von der Commit -Nachricht abhängen), ist zu überprüfen HASH^2
Und sehen Sie, ob ich keinen Fehler bekomme, gibt es einen besseren Weg?
Lösung
Es ist einfach, herauszufinden, ob etwas eine Zusammenführung ist. Das alles begeht mit mehr als einem Elternteil. Um dies zu überprüfen, können Sie beispielsweise dies tun
$ git cat-file -p $commit_id
Wenn die Ausgabe mehr als eine "übergeordnete" Linie enthält, haben Sie eine Zusammenführung gefunden.
Für Rückkehrer ist es nicht so einfach. Im Allgemeinen sind Rückgänge nur normale Commits, die den Diff eines früheren Commits in umgekehrt anwenden und die von den eingeführten Veränderungen effektiv entfernen. Ansonsten gibt es nichts Besonderes.
Wenn eine Rückkehr mit erstellt wurde mit git revert $commit
, dann generiert Git normalerweise eine Commit -Nachrichtenanzeige, die zurückgekehrt ist und was er wiederverwendet hat. Es ist jedoch durchaus möglich, Rückkehr auf andere Weise zu tun oder einfach die Commit -Nachricht eines von einem von generierten Commits zu ändern git revert
.
Die Suche nach den generierten Revert -Commit -Nachricht ist möglicherweise bereits eine gute Heuristik für das, was Sie erreichen möchten. Wenn nicht, müssten Sie tatsächlich andere Commits durchsehen und ihre Diffs miteinander vergleichen und einen genauen umgekehrten Betrieb eines anderen betrachten. Aber selbst das ist keine gute Lösung. Oft unterscheiden sich genug Rückkehrungen leicht von der Umkehrung des von ihnen zurückgekehrten Commits, zum Beispiel, um für Codeänderungen zwischen dem Komitee und dem Rückkehr aufzutreten.
Andere Tipps
Die folgende Anweisung wird ausgeben nur Die Eltern -Hashes. Weniger Filterung benötigt ...
git show --no-patch --format="%P" <commit hash>
Die Antwort verwendet git cat-file
Verwendet ein Git "Installation" Der Befehl, der im Allgemeinen besser zum Erstellen von Skripten ist, da sich das Ausgabeformat nicht ändert. Diejenigen verwenden git show
und git rev-parse
Möglicherweise müssen sich im Laufe der Zeit ändern, wenn sie verwendet werden Porzellan Befehle.
Die Bash -Funktion, die ich schon lange verwendet habe git rev-list
:
gitismerge () {
local sha="$1"
msha=$(git rev-list -1 --merges ${sha}~1..${sha})
[ -z "$msha" ] && return 1
return 0
}
Die Liste der Befehle von Porzellan/Sanitäranlagen finden Sie in den Dokumenten für die oberste Ebene Git Befehl.
Dieser Code verwendet Git-rev-Liste mit einem bestimmten Gitrevisionen Anfrage ${sha}~1..${sha}
Auf eine Weise, die das zweite Elternteil eines SHA druckt, wenn er existiert, oder nichts, wenn es nicht vorhanden ist, was genau die Definition eines Zusammenführungsausschusses ist.
Speziell, SHA~1..SHA
meint Fügen Sie Commits ein, die von SHA erreichbar sind, aber diejenigen ausschließen, die erreichbar sind, sha ~ 1, was der erste Elternteil von SHA ist.
Die Ergebnisse werden in $ mSHA gespeichert und mit Bash auf Leere getestet [ -z "$msha" ]
Fehler (zurückgeben 1), wenn Sie leer sind oder wenn Sie 0 zurückgeben, wenn nicht leer ist.
Eine Möglichkeit, einen Merge -Commit zu testen:
$ test -z $(git rev-parse --verify $commit^2 2> /dev/null) || echo MERGE COMMIT
Was Git widmet Commits, stimme ich mit @rafl Der realistischste Ansatz besteht darin, nach dem Rückkehr -Nachrichten -Boilerplate in der Commit -Nachricht zu suchen. Wenn jemand es änderte, wäre es sehr involviert.
Einfache Möglichkeit, das Merge -Commit zu testen:
git show --summary HEAD | grep -q ^Merge:
Dies wird 0 für Merge-Commits zurückgeben, 1 für Nicht-Merge-Commits. Ersetzen Sie den Kopf durch Ihr gewünschtes Verpflichtung zum Testen.
Beispiel Verwendung:
if git show --summary some-branch | grep -q ^Merge: ; then
echo "some-branch is a merge"
fi
Noch eine Möglichkeit, die Eltern eines Commits zu finden:
git show -s --pretty=%p <commit>
Verwenden %P
für vollen Hash. Dies druckt, wie viele Eltern HEAD
hat:
git show -s --pretty=%p HEAD | wc -w