Ich habe viele Git-Zweige. Wie kann ich Zweige löschen, die bereits zusammengeführt wurden? Gibt es eine einfache Möglichkeit, sie alle zu löschen, anstatt sie einzeln zu löschen?
UPDATE:
Sie können andere Zweige wie master und dev ausschließen, wenn Ihr Workflow diese als mögliche Vorfahren hat. Normalerweise verzweige ich von einem "sprint-start" Tag und master, dev und qa sind keine Vorfahren.
Listen Sie zunächst alle Zweige auf, die in remote zusammengeführt wurden.
git branch --merged
Wir können ein paar Argumente hinzufügen, um wichtige Zweige zu überspringen, die wir nicht löschen wollen, wie z.B. master oder develop. Der folgende Befehl überspringt den Master-Zweig und alle Zweige, die dev enthalten.
git branch --merged| egrep -v "(^\*|master|dev)"
Wenn Sie den Zweig überspringen wollen, können Sie ihn wie folgt zum egrep-Befehl hinzufügen. Der Zweig skip_branch_name
wird nicht gelöscht.
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
So löschen Sie alle lokalen Zweige, die bereits mit dem aktuell ausgecheckten Zweig zusammengeführt wurden:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Sie können sehen, dass master und dev ausgeschlossen sind, falls sie ein Vorgänger sind.
Sie können einen zusammengeführten lokalen Zweig mit löschen:
git branch -d branchname
Wenn er nicht zusammengeführt wurde, verwenden Sie:
git branch -D branchname
Um es in alten Versionen von Git aus dem Remote zu löschen, verwenden Sie:
git push origin :branchname
In neueren Versionen von Git verwenden Sie:
git push --delete origin branchname
Sobald Sie den Zweig aus der entfernten Datei gelöscht haben, können Sie mit prune die entfernten Verfolgungszweige loswerden:
git remote prune origin
oder einzelne Remote-Tracking-Zweige beschneiden, wie in der anderen Antwort vorgeschlagen, mit:
git branch -dr branchname
Ich hoffe, das hilft.
Ich verwende das folgende Ruby-Skript, um meine bereits zusammengeführten lokalen und entfernten Zweige zu löschen. Wenn ich dies für ein Repository mit mehreren entfernten Zweigen mache und nur von einem löschen möchte, füge ich einfach eine Select-Anweisung zur Liste der entfernten Zweige hinzu, um nur die gewünschten Zweige zu erhalten.
#!/usr/bin/env ruby
current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
if $?.exitstatus == 0
puts "WARNING: You are on branch #{current_branch}, NOT master."
else
puts "WARNING: You are not on a branch"
end
puts
end
puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
split("\n").
map(&:strip).
reject {|b| b =~ /\/(#{current_branch}|master)/}
local_branches= `git branch --merged`.
gsub(/^\* /, '').
split("\n").
map(&:strip).
reject {|b| b =~ /(#{current_branch}|master)/}
if remote_branches.empty? && local_branches.empty?
puts "No existing branches have been merged into #{current_branch}."
else
puts "This will remove the following branches:"
puts remote_branches.join("\n")
puts local_branches.join("\n")
puts "Proceed?"
if gets =~ /^y/i
remote_branches.each do |b|
remote, branch = b.split(/\//)
`git push #{remote} :#{branch}`
end
# Remove local branches
`git branch -d #{local_branches.join(' ')}`
else
puts "No branches removed."
end
end
In Git gibt es keinen Befehl, der dies automatisch für Sie erledigt. Sie können jedoch ein Skript schreiben, das mit Hilfe von Git-Befehlen das Gewünschte liefert. Dies kann auf verschiedene Weise geschehen, je nachdem, welches Verzweigungsmodell Sie verwenden.
Wenn Sie wissen müssen, ob ein Zweig in Master zusammengeführt wurde, liefert der folgende Befehl keine Ausgabe, wenn myTopicBranch zusammengeführt wurde (d. h. Sie können ihn löschen)
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Sie könnten den Git-Branch-Befehl verwenden und alle Zweige in der Bash auslesen und eine "for"-Schleife über alle Zweige ausführen. In dieser Schleife prüfen Sie mit obigem Befehl, ob Sie den Zweig löschen können oder nicht.