Exclua ramos GIT antigos já mesclados no mestre

(postagem cruzada de http://blog.evantahler.com/delete-old-git-branches-already-merged-into-master )

Era hora de limpar alguns ramos antigos do git no TaskRabbit hoje. Descobrimos que tínhamos centenas de galhos “antigos” e podiam ser removidos. O que quero dizer com “velho”? Como acontece com muitas coisas, chegar à definição adequada é metade da batalha. No final do dia, “antigo” significava “ Fui mesclado com o master e não contenho código não mesclado ” (onde master é o seu branch de integração).

Quando formulado dessa forma, há algumas maneiras simples e sistemáticas de fazer alguma poda git. Aqui está uma tarefa simples de rake:

namespace :git do

desc
"delete remote branches which have already been merged into master"
task
:clean_merged_branches do
local_branches
= `git branch`.split("n").map{ |line| line.gsub(" ","") }
raise "You need to be in master to start this game" unless local_branches.include?('* master')
say_and_do
("git fetch --prune")
bad_branches
= `git branch -r --merged`.split("n").map{ |line| line.gsub(" ","") }
bad_branches
.each do |bad_branch|
parts
= bad_branch.split("/")
remote
= parts.shift
if remote == "origin"
branch
= parts.join("/")
next if branch =~ /^HEAD.*/
next if branch == /^refs/.*/
next if branch == "master"
next if branch == /.*staging.*/
next if branch == /.*production.*/

say_and_do
("git branch -D #{branch}") if local_branches.include?(branch)
say_and_do
("git push origin :#{branch}")
else
puts
"skipping #{bad_branch} because it doesn't have a remote of 'origin'"
end
end
end
end

def say_and_do(stuff, explanation=nil)
puts explanation
if explanation
puts
" > #{stuff}"
`#{stuff}`
end

O truque aqui é o git fetch -r mergedcomando que faz exatamente o que queremos: fale-me sobre os branches remotos que foram todos mesclados em meu branch atual, mestre. Simplesmente coletamos esses ramos e os apagamos localmente (se existirem) e na origem.

A lógica é assim

  • Certifique-se de que estou no branch master
  • git fetch –prune (limpe minha lista de branch local de acordo com a lista do remote)
  • git fetch -r –merged (mostre os branches que foram fundidos no branch de integração)
  • percorrer essas ramificações e excluí-las local e remotamente

Dois outros pontos importantes:

  • É muito provável que você tenha algumas ramificações de teste, teste e produção que sejam equivalentes ou um pouco atrás de sua ramificação de integração. Você provavelmente deseja ignorar explicitamente aqueles
  • Se você tiver mais de uma configuração de branch remoto (talvez heroku para implantação ou tddium para teste), você deseja ter certeza de ignorar qualquer branch que não seja de “origem”