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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top