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! :)