Ho molti rami Git. Come faccio a cancellare i rami che sono già stati uniti? C'è un modo semplice per cancellarli tutti invece di cancellarli uno per uno?
AGGIORNAMENTO:
Puoi aggiungere altri rami da escludere come master e dev se il tuo flusso di lavoro ha quelli come possibili antenati. Di solito ramifico da un "sprint-start" tag e master, dev e qa non sono antenati.
Per prima cosa, elenca tutti i rami che sono stati uniti in remoto.
git branch --merged
Si potrebbero vedere alcuni rami che non si desidera rimuovere. Possiamo aggiungere alcuni argomenti per saltare rami importanti che non vogliamo eliminare come master o uno sviluppo. Il seguente comando salterà il ramo master e tutto ciò che ha dev in esso.
git branch --merged| egrep -v "(^\*|master|dev)"
Se volete saltare, potete aggiungerlo al comando egrep come il seguente. Il ramo skip_branch_name
non verrà cancellato.
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
Per cancellare tutti i rami locali che sono già fusi nel ramo attualmente controllato:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Puoi vedere che master e dev sono esclusi nel caso siano un antenato.
È possibile eliminare un ramo locale unito con:
git branch -d branchname
Se non è unito, usa:
git branch -D branchname
Per eliminarlo dal remoto nelle vecchie versioni di Git usare:
git push origin :branchname
Nelle versioni più recenti di Git usare:
git push --delete origin branchname
Una volta eliminato il ramo dal remoto, è possibile potare per sbarazzarsi dei rami di tracciamento remoto con:
git remote prune origin
o potare i singoli rami di tracciamento remoto, come suggerisce l'altra risposta, con:
git branch -dr branchname
Spero che questo aiuti.
Uso il seguente script Ruby per cancellare i miei rami locali e remoti già fusi. Se lo sto facendo per un repository con più rami remoti e voglio cancellare solo da uno, aggiungo semplicemente una dichiarazione di selezione alla lista dei rami remoti per ottenere solo i rami remoti che voglio.
#!/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
Non c'è nessun comando in Git che lo farà automaticamente per te. Ma puoi scrivere uno script che usi i comandi di Git per darti ciò di cui hai bisogno. Questo potrebbe essere fatto in molti modi a seconda del modello di ramificazione che stai usando.
Se hai bisogno di sapere se un ramo è stato fuso in master il seguente comando non darà alcun output se myTopicBranch è stato fuso (cioè puoi cancellarlo)
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Si potrebbe usare il comando Git branch e analizzare tutti i rami in Bash e fare un ciclo for
su tutti i rami. In questo ciclo si controlla con il comando di cui sopra se si può cancellare il ramo o no.