Eu tenho muitos ramos Git. Como posso apagar as filiais que já foram fundidas? Existe uma maneira fácil de apagá-los todos em vez de apagá-los um a um?
ACTUALIZAR:
Você pode adicionar outros ramos para excluir como master e dev se o seu fluxo de trabalho tiver esses como um possível antepassado. Normalmente eu ramifico de uma tag "sprint-start" e master, dev e qa não são antepassados.
Primeiro, liste todas as filiais que foram fundidas em remoto.
git branch --merged
Você pode ver poucos ramos que você não quer remover. podemos adicionar poucos argumentos para pular ramos importantes que não queremos apagar como mestre ou um desenvolvimento. O seguinte comando irá saltar o ramo mestre e qualquer coisa que tenha desenvolvimento nele.
git branch --merged| egrep -v "(^\*|master|dev)"
Se você quiser pular, você pode adicioná-lo ao comando egrep como o seguinte. O ramo skip_branch_name
não será excluído.
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
Para eliminar todas as filiais locais que já estão fundidas na filial actualmente verificada:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Você pode ver que mestre e dev são excluídos no caso de serem um ancestral.
Você pode eliminar uma filial local fundida com:
git branch -d branchname
Se não estiver fundido, use:
git branch -D branchname
Para apagá-lo do controle remoto em versões antigas de uso do Git:
git push origin :branchname
Em versões mais recentes de uso do Git:
git push --delete origin branchname
Uma vez apagado o ramo do controle remoto, você pode podar para se livrar dos ramos de rastreamento remoto com:
git remote prune origin
ou podar ramos individuais de rastreamento remoto, como a outra resposta sugere, com:
git branch -dr branchname
Espero que isto ajude.
Eu uso o seguinte script Ruby para apagar as minhas filiais locais e remotas já fundidas. Se o estou a fazer para um repositório com vários remotos e apenas quero apagar de um, apenas adiciono uma declaração seleccionada à lista de remotos para obter apenas os remotos que quero.
#!/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
Não há nenhum comando em Git que faça isso para você automaticamente. Mas você pode escrever um script que usa os comandos de Git para lhe dar o que você precisa. Isto pode ser feito de muitas maneiras dependendo do modelo de ramificação que você está usando.
Se você precisa saber se um ramo foi fundido no master, o seguinte comando não dará saída se o myTopicBranch foi fundido (ou seja, você pode apagá-lo)
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Você poderia usar o comando Git branch e analisar todos os branches no Bash e fazer um loop `for' sobre todos os branches. Neste loop você verifica com o comando acima se você pode apagar o ramo ou não.