2016-04-22 9 views
0

Ich weiß, diese Frage wurde bereits in ähnlicher Weise angesprochen. Ich suche jedoch ein strengeres Auswahlkriterium, nämlich Ich bin daran interessiert sind nur in den Zweigen derGit: Finden Sie alle Remote-Niederlassungen in Frage * zum Löschen (* letzten Commit ist eine Zusammenführung zu meistern)

  1. wurden
  2. habe keine weiteren Commits nach der Zusammenführung zu meistern

Dies ist zu vermeiden, zu löschen Zweige zu meistern verschmolzen, die etwas weiter haben (evtl. wertvolle) Arbeit, die aber nicht zum Master zusammengeführt wurden (durch mögliche Weglassung, abgebrochene Pull-Anfrage etc.)

Antwort

1

Viel einfacher, für diesen speziellen Fall (Überprüfung, was Fernverfolgung Zweige vollständig in master verschmolzen):

git branch -r --merged master 

(und natürlich --no-merged für diejenigen, die Arbeit noch brauchen auf ihnen, wie Kommentare zu other answer).

1

Hier ist die vorgeschlagene Lösung:

Annahme: Der älteste Vorfahre wird als Ursprung/Master angenommen. Dies ist gängige Praxis, aber es ist nicht schädlich, sie auszusprechen.

git branch -r --list --contains `git rev-list --max-parents=0 origin/master`| grep -v origin\/master | sed 's/^..\(.*\)/\1/' | xargs -I {} sh -c "echo -n {}' : '; git log --graph -n 1 {} | grep -c '^|[\]\ \ Merge'" 

Schritt für Schritt

  1. Suche aller Remote-Niederlassungen, die den anfänglichen Master haben als Nachkommen begehen.
  2. Überprüfen Sie für jeden Zweig, ob das letzte Commit eine Verknüpfung zum ältesten Vorgänger ist.

Der Ausgabebericht sieht wie folgt aus. Eine 1 neben der Verzweigung bedeutet, dass sie gelöscht werden kann

origin/0.2016.02-release : 1 
origin/0.2016.03-release : 1 
origin/Fix-for-NPE-schedule-master : 0 
origin/Fix-possible-infinite-loop-master : 0 
origin/Fixing-unit-tests-master : 0 
origin/NoBodyRequiredForActivity-master : 0 
origin/Removing-not-needed-dependency-master : 0 
origin/updateDevServiceConfig-master : 0 
origin/updateServerPort-master : 0 
origin/updatedPom : 1 

Hoffen, das hilft jedem auf der Suche nach etwas Ähnlichem. Würde begrüßen alle Vorschläge und Verbesserungen

+0

Sie müssen sich nicht um Root-Commits kümmern ('--max-elterns = 0'), nur über jeden tipmost-Commit. Jede Zusammenführung bewirkt, dass alle eingefügten Commits von diesem Pfad aus erreichbar sind und alle Vorgänger per Definition von ihren Nachfolgern aus erreichbar sind. Das '-merged'-Prädikat von 'git branch' (jetzt auch in' git for-each-ref' verfügbar) handhabt das für dich, also bringt 'git branch -r --merged master' dir deine Liste. – torek

+0

Aber ist es nicht wahr, dass 'git branch -r --merged master' nicht zwischen Zweigen unterscheidet, die nach der letzten Zusammenführung weitere Commits haben, und diejenigen, die dies nicht tun? Das ist das Problem, an dem ich interessiert bin. – diarmuid

+1

Nein, es ist nicht wahr: "--merged" bedeutet "testet das Tip Commit von' $ theirs' gegen das Tip Commit von '$ our', mit der offensichtlichen Bedeutung für' $ ours' und '$ theirs', und Der Test besteht aus "is ancestor" (der gleiche Test wird mit "git merge-base --is-ancestor" durchgeführt.) Nehmen wir an, dass "origin/good" auf "X" und "origin/bad" verweist zeigt auf 'Y', wobei' X' entweder hinter der Spitze von 'Master' steht oder die Spitze von' Master' ist, aber 'Y' nicht von (der Spitze von)' Master' aus erreichbar ist. is-ancestor-Test besteht für 'X' (' X' * ist * ein Vorfahre der Spitze von 'master'), aber scheitert für' Y'. – torek