611 Stimmen

So finden Sie den nächstgelegenen Elternteil eines Git-Zweigs

Nehmen wir an, ich habe das folgende lokale Repository mit einem Commit-Baum wie diesem:

master --> a
            \
             \
      develop c --> d
               \
                \
         feature f --> g --> h

master ist mein dies ist der neueste stabile Release-Code , develop ist mein dies ist der "nächste" Freigabecode und feature ist eine neue Funktion, die in Vorbereitung ist für develop .

Mit Hilfe von Hooks möchte ich Pushes verweigern können an feature in mein entferntes Repository zu übertragen, es sei denn f ist ein direkter Abkömmling von develop HEAD. D.h. der Commit-Baum sieht so aus, weil das Feature git rebase auf d .

master --> a
            \
             \
      develop c --> d
                     \
                      \
               feature f --> g --> h

Ist es also möglich,:

  • Identifizieren Sie den übergeordneten Zweig von feature ?
  • Identifizieren Sie die Übertragung im übergeordneten Zweig, die f ist ein Nachkomme von?

Von dort aus würde ich prüfen, was HEAD des übergeordneten Zweigs ist, und sehen, ob f Vorgänger mit dem übergeordneten Zweig HEAD übereinstimmt, um festzustellen, ob das Merkmal neu geordnet werden muss.

1voto

Rod Punkte 13275

Git wird mit einer Reihe von GUI-Clients geliefert, die Ihnen helfen, dies zu visualisieren. Öffnen Sie GitGUI und gehen Sie zum Menü Repository Visualisierung der gesamten Branchenhistorie .

0 Stimmen

Wie genau wird "GitGUI" geöffnet? Welche Plattform (Betriebssystem usw.)? Können Sie Ihrer Antwort einige Referenzen hinzufügen (aber ohne "Bearbeiten:", "Aktualisieren:" oder ähnlich - die Antwort sollte so aussehen, als wäre sie heute geschrieben worden)?

1voto

alx Punkte 3385

Die Lösungen basieren auf git show-branch -a Außerdem haben einige Filter einen Nachteil: Git kann einen Zweignamen eines kurzlebigen Zweigs berücksichtigen.

Wenn Sie ein paar mögliche Eltern haben, die Ihnen wichtig sind, können Sie sich diese ähnliche Frage stellen (und wahrscheinlich die, die der OP wissen wollte):

Aus einer bestimmten Teilmenge aller Branchen, Welches ist der nächstgelegene Elternteil eines Git-Zweigs?

Der Einfachheit halber bezeichne ich "einen Git-Zweig" als HEAD (d.h. der aktuelle Zweig).

Nehmen wir an, wir haben folgende Zweige:

HEAD
important/a
important/b
spam/a
spam/b

Die Lösungen basieren auf git show-branch -a + Filter, kann ergeben, dass der nächste Elternteil von HEAD ist spam/a aber das interessiert uns nicht.

Wenn wir wissen wollen, welche der important/a et important/b ist der engste Elternteil von HEAD könnten wir folgendes ausführen:

for b in $(git branch -a -l "important/*" | sed -E -e "s/\*//"); do
    d1=$(git rev-list --first-parent ^${b} HEAD | wc -l);
    d2=$(git rev-list --first-parent ^HEAD ${b} | wc -l);
    echo "${b} ${d1} ${d2}";
done \
| sort -n -k2 -k3 \
| head -n1 \
| awk '{print $1}';

Was es bewirkt:

1.) $(git branch -a -l "important/*" | sed -E -e "s/\*//") : Druckt eine Liste aller Zweige mit einem bestimmten Muster ( "important/*" ). (Wenn Sie zufällig auf einem der important/* Zweige, git branch enthält ein *, um Ihre aktuelle Verzweigung anzuzeigen. Die Befehlssubstitution $() wird dann in den Inhalt Ihres aktuellen Verzeichnisses expandiert. Die sed beseitigt die * von der Ausgabe von git branch .)

2.) d=$(git rev-list --first-parent ^${b} HEAD | wc -l); : Für jeden dieser Zweige ( $b ), berechnen Sie die Entfernung ( $d1 ) in Anzahl der Übertragungen, von HEAD bis zur nächsten Übergabe in $b (ähnlich wie bei der Berechnung der Entfernung zwischen einem Punkt und einer Linie). Vielleicht möchten Sie den Abstand hier anders betrachten: Sie möchten vielleicht nicht --first-parent oder den Abstand von der Spitze zur Spitze der Zweige ( "${b}"...HEAD ), ...

2.2) d2=$(git rev-list --first-parent ^HEAD ${b} | wc -l); : Für jeden dieser Zweige ( $b ), berechnen Sie die Entfernung ( $d2 ) in Anzahl der Übertragungen von der Spitze des Zweigs bis zur nächstgelegenen Übertragung in HEAD . Wir werden diesen Abstand verwenden, um zwischen zwei Zweigen zu wählen, deren Abstand $d1 gleich war.

3.) echo "${b} ${d1} ${d2}"; : Drucken Sie die Namen der einzelnen Zweige, gefolgt von den Entfernungen, um sie später sortieren zu können (erste $d1 und dann $d2 ).

4.) | sort -n -k2 -k3 : Sortieren Sie das vorherige Ergebnis, so dass Sie eine (nach Entfernung) sortierte Liste aller Zweige erhalten, gefolgt von ihren Entfernungen (beide).

5.) | head -n1 : Das erste Ergebnis des vorherigen Schritts ist der Zweig mit dem geringsten Abstand, d.h. der nächstgelegene Elternzweig. Verwirf also einfach alle anderen Zweige.

6.) | awk '{print $1}'; : Wir interessieren uns nur für den Namen des Zweigs und nicht für die Entfernung, also extrahieren wir das erste Feld, das der Name des Elternteils war. Hier ist es! :)

0voto

verdverm Punkte 333

Dies hat bei mir nicht funktioniert, als ich etwas wie folgt gemacht hatte entwickeln. release-v1.0.0 feature-foo . Es würde den ganzen Weg zurück zur Entwicklung gehen. Beachten Sie, es war ein rebase beteiligt und ich bin mir nicht sicher, ob das mein Problem zusammengesetzt ist...

Die folgenden Angaben ergaben bei mir den richtigen Commit-Hash:

git log --decorate \
  | grep 'commit' \
  | grep 'origin/' \
  | head -n 2 \
  | tail -n 1 \
  | awk '{ print $2 }' \
  | tr -d "\n"

0 Stimmen

Bislang scheint das die einzige Lösung zu sein, die für mich funktioniert. Kleiner Tipp: Verwenden Sie ripgrep anstelle von grep, dann geht es fast sofort.

0 Stimmen

Wir haben uns das sehr erleichtert, indem wir die genaue Antwort in einer <branch>.json Datei in der Repo. Das ist zwar etwas unübersichtlich, aber es gibt uns eine enorme Flexibilität, um zusätzliche Variablen für die Speicherung von Informationen und die Steuerung von Prozessen in CI zu definieren. Wir haben ein Skript erstellt, das einen Zweig erzeugt, diese Datei erstellt und dann committet und pusht, wobei es gleichzeitig den Ursprung einrichtet.

0voto

Mike6679 Punkte 5189

Wenn Sie Sourcetree verwenden, sehen Sie sich Ihre Commit-Details an Eltern . Dann sehen Sie die unterstrichenen Commit-Nummern (Links).

0voto

jake Punkte 91

Jeder, der dies heutzutage tun möchte - Atlassian's Quellennachweis Anwendung zeigt Ihnen eine großartige visuelle Darstellung, wie Ihre Zweige zueinander in Beziehung stehen, d.h. wo sie begonnen haben und wo sie derzeit in der Commit-Reihenfolge stehen (z.B. HEAD oder 4 Commits dahinter, etc.).

0 Stimmen

Es kann sein, dass man den übergeordneten Zweig in einem Skript verwenden muss, und dafür muss man den Namen des übergeordneten Zweigs extrahieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X