Poda automática com busca ou extração do Git

248

Se alguém excluiu uma ramificação remota porque o trabalho terminou e eu não sei, não efetuarei uma git fetch --prunee, eventualmente, empurrarei a ramificação excluída.

Existe uma solução viável para forçar o Git a usar o modo de remoção ao buscar / puxar sem precisar especificá-lo todas as vezes?

Edmondo1984
fonte
1
Em breve (git 1.8.5, quarto trimestre de 2013) será possível especificar na configuração local de um repositório que você sempre deseja remover git fetch! Veja minha resposta abaixo
VonC

Respostas:

395

Desde o git 1.8.5 (quarto trimestre de 2013) :

" git fetch" (daí " git pull" também) aprendeu a verificar as variáveis ​​de configuração " fetch.prune" e " remote.*.prune" e a se comportar como se a opção " --prune" da linha de comando fosse fornecida.

Isso significa que, se você definir remote.origin.prune como true:

git config remote.origin.prune true

Qualquer um git fetchou git pullserá podado automaticamente.

Nota: O Git 2.12 (primeiro trimestre de 2017) corrigirá um erro relacionado a essa configuração, o que faria com que se git remote renamecomportasse mal.
Consulte " Como renomear um git remote? ".


Veja mais em commit 737c5a9 :

Sem " git fetch --prune", as ramificações de rastreamento remoto de uma ramificação que o outro lado já removeu permanecerão para sempre.
Algumas pessoas querem sempre executar " git fetch --prune".

Para acomodar usuários que desejam remover sempre ou ao buscar em um controle remoto específico, adicione duas novas variáveis ​​de configuração " fetch.prune" e " remote.<name>.prune":

  • " fetch.prune" permite ativar a remoção para todas as operações de busca.
  • " remote.<name>.prune" permite alterar o comportamento por controle remoto.

O último substituirá naturalmente o anterior e a --[no-]pruneopção na linha de comando substituirá o padrão configurado.

Como --pruneé uma operação potencialmente destrutiva (o Git ainda não mantém reflogs para referências excluídas), não queremos remover sem o consentimento dos usuários; portanto, essa configuração não estará ativada por padrão.

VonC
fonte
4
Isso de fato está incluído no agora lançado git 1.8.5
Bessey
1
Quero esse comportamento por padrão em todos os meus repositórios git. Existe algum lugar onde eu possa colocar isso no meu .gitconfig para que isso aconteça?
Andrew
47
@ Andrew um bom começo seriagit config --global fetch.prune true
VonC
1
Quais são as possíveis desvantagens de sempre podar ao puxar? a citação menciona que a história do reflog é afetada ... mas que problema prático isso poderia introduzir?
Grapho 15/10
3
@Grapho nenhuma desvantagem real, mas ... veja mais em stackoverflow.com/a/39862779/6309
VonC
143

git config --global fetch.prune true

Para sempre --prunepara git fetche git pullem todos os seus repositórios Git:

git config --global fetch.prune true

Este comando acima anexa à sua configuração global do Git (normalmente ~/.gitconfig) as seguintes linhas. Use git config -e --globalpara visualizar sua configuração global.

[fetch]
    prune = true

git config remote.origin.prune true

Para sempre, --prunemas de um único repositório:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name

Este comando acima adiciona na sua configuração local do Git (normalmente .git/config) a última linha abaixo. Use git config -epara visualizar sua configuração local.

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true

Você também pode usar --globaldentro do segundo comando ou, em vez disso, usar --localdentro do primeiro comando.


git config --global gui.pruneDuringFetch true

Se você usar, git guitambém poderá se interessar por:

git config --global gui.pruneDuringFetch true

que acrescenta:

[gui]
    pruneDuringFetch = true

Referências

As documentações correspondentes de git help config:

--global

  Para opções de gravação: escreva no ~/.gitconfigarquivo global em vez do repositório .git/config, escreva no $XDG_CONFIG_HOME/git/configarquivo se esse arquivo existir e o ~/.gitconfigarquivo não existir .

 

--local

  Para opções de gravação: grave no .git/configarquivo do repositório . Este é o comportamento padrão.

 

fetch.prune

  Se verdadeiro, a busca se comportará automaticamente como se a --pruneopção tivesse sido dada na linha de comando. Veja também remote.<name>.prune.

 

gui.pruneDuringFetch

  "true" se o git-gui podar ramificações de rastreamento remoto ao executar uma busca. O valor padrão é falso".

 

remote.<name>.prune

  Quando definida como true, a busca neste controle remoto também remove as referências de rastreamento remoto que não existem mais no controle remoto (como se a --pruneopção tivesse sido fornecida na linha de comando). Substitui as fetch.pruneconfigurações, se houver.

olibre
fonte
1
Nota: Acabei de aprender sobre git config -ee git config -e --globalcom este post. Chega de vimcomandos de digitação para apontar para um caminho específico para um arquivo de configuração do git e ter que pensar sobre o que é esse caminho específico.
ecbrodie
1
Agora, esta é uma resposta com a qual você pode trabalhar. Muito obrigado.
sebingel
Esta resposta é bastante completa, mas muito difícil de ler devido à sua formatação. Eu teria achado "Sempre - podar o git fetch e o git pull em todos os seus repositórios Git: git config --global fetch.prune true" da mesma forma (com um link para os documentos relevantes).
Thibaud Colas
19

Se você quiser sempre prunequando quiser fetch, posso sugerir o uso de aliases .

Basta digitar git config -epara abrir seu editor e alterar a configuração de um projeto específico e adicionar uma seção como

[alias]
pfetch = fetch --prune   

quando você buscar git pfetcha ameixa, será feito automaticamente.

Obrigado por todos os peixes
fonte
Compreendo. Pull by the way usará git fetch e não git pfetch ... eu deveria ter um alias diretamente para pull?
Edmondo1984
1
Eu vou. Desta forma, você tem duas opções, normal pulle fetche sua versão podada. Na verdade, acho (mas eu não tentei) você pode escrever fetch = fetch --prunediretamente na seção alias e, portanto, pullusará o podadas buscar automaticamente
ThanksForAllTheFish
2
Tanto quanto eu sei fetch = fetch --pruneque não funciona, substituir um comando por um alias não funcionou para mim. Isto poderia ser porque eu estou usando uma versão antiga (1.7.2.5)
Uipko
3
Na documentação de configuração do git: "Para evitar confusão e problemas com o uso de scripts, os aliases que ocultam os comandos Git existentes são ignorados."
Dewayne Christensen