Configure o git para puxar e empurrar todos os ramos

616

Eu gostaria de empurrar e puxar todos os ramos por padrão, incluindo os recém-criados.

Existe uma configuração que eu possa definir?

Caso contrário, quando adiciono uma nova ramificação, localmente, e quero extraí-la do servidor, qual é a maneira mais simples de fazer isso?

Eu criei um novo ramo com o mesmo nome e tentei puxar, mas ele não funciona. Me pede todas as configurações remotas da filial. Como faço para configurá-lo.

Lakshman Prasad
fonte
4
"e tentou puxar, mas não funciona". Detalhes por favor. Mostre-nos qual comando você tentou usar.
Jakub Narębski

Respostas:

1298

A maneira mais simples é fazer:

git push --all origin

Isso enviará tags e ramificações.

brimble2010
fonte
10
Entre dezenas de respostas que encontrei no SO e em outros lugares, esta é a maneira mais simples de enviar por push um ramo local recém-criado, sem tocar na configuração. Obrigado!
András Szepesházi
174
E se você adicionar -uuma vez, por exemplo git push --all origin -u, o rastreamento é configurado e, depois disso, você pode simplesmente usá-lo git push.
Alec
23
Para a versão 1.7.12.3 do git, tive que usar git push --tags originpara enviar todas as tags.
thisgeek
17
Também olhar para "--mirror" em vez de "--all" este impulso mais coisas
Loda
21
AVISO: Se você tiver várias ramificações LOCAIS que você não limpou (recursos, hotfix) - ou não limpou corretamente (eu), isso inundará seu controle remoto. Droga. E nós apenas fizemos uma poda. Não sei por que meu local tinha tantos ramos sobrando.
Jack
147

Com o git moderno, você sempre busca todas as ramificações (como ramificações de rastreamento remoto no refs/remotes/origin/*espaço para nome, visíveis com git branch -rou git remote show origin).

Por padrão (consulte a documentação da push.defaultvariável de configuração), você empurra ramos correspondentes , o que significa que primeiro você precisa fazer com que o git push origin branchgit o empurre sempre git push.

Se você deseja sempre enviar todas as ramificações por push , é possível configurar push refspec. Supondo que o controle remoto seja nomeado, originvocê pode usar o git config :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

ou edite diretamente o .git/configarquivo para ter algo como o seguinte:

[origem remota]
        url = usuá[email protected]: /srv/git/repo.git
        busca = + refs / heads / *: refs / remotes / origin / *
        buscar = + refs / tags / *: refs / tags / *
        push = + refs / cabeças / *: refs / cabeças / *
        push = + refs / tags / *: refs / tags / *
Jakub Narębski
fonte
3
@ Merc: git push --all originé bom publicar uma vez todas as ramificações e tags, embora o padrão até a semântica 'correspondente' da versão atual signifique que você enviaria todas as ramificações depois ... a menos que adicione uma nova ramificação ou tag. A configuração para "empurrar [...] todas as ramificações por padrão" é como escrita.
Jakub Narębski
Você pode melhorar a resposta para adicionar a maneira de reconfigurar o Git dessa maneira. Isso é útil para usuários que configuraram o modo simples.
Dereckson
3
Isso mudou desde o git 2.0. O padrão de envio é simples, não correspondendo mais.
Mike
Eu tentei isso e tenho um erro no push: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Nota:.. Eu estou no git 2.0 Eu ainda estou trabalhando para fora como consertar isso)
Brian Lacy
2
Agora o valor padrão para push.defaulté simple.
precisa saber é o seguinte
32

Incluir o + na especificação de envio é provavelmente uma má ideia, pois significa que o git fará um envio sem avanço rápido, mesmo sem o -f , e se o servidor remoto estiver configurado para aceitá-lo, você poderá perder o histórico.

Tente exatamente isso:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'
Mark Reed
fonte
Você também pode adicionar a --globalopção a cada um deles para tornar este o padrão global para todos os seus repositórios.
Éter
É lamentável que o + seja adicionado automaticamente pelo git ao fazer isso git remote add.
Éter
27

Eu usei os comandos abaixo para migrar todas as ramificações para o novo repositório.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

NOTA : Eu tive que usar o segundo último comando (ou seja, pressionar primeiro o mestre) enquanto clonava um repo de Atlassian Stash para o AWS CodeCommit (repo em branco). Não tenho certeza do motivo, mas depois de pressionar ( git push new-origin --mirror) o ramo padrão estava se referindo a algum outro ramo que não master.

vikas027
fonte
1
Perfeito para mover um repositório para outro host. Obrigado!
Pelmered
2
Este é realmente apenas um método útil. Use git push new_origin --allapenas envie suas ramificações locais atuais para new_origin, nem todas as ramificações de origem.
yanzi1225627
Apenas observando que isso cria um --barerepositório, que é um pouco diferente de um repositório regular, ele possui apenas os .gitarquivos, não seus arquivos. É perfeitamente suficiente se você não vai trabalhar nele. Veja --baree --mirror git-scm.com/docs/git-clone .
jmmut
Embora ele tenha apenas os arquivos .git e não o código-fonte real, se você executar uma atualização remota, ela buscará novamente tudo, desde a origem até o destino.
SanthoshM
Este foi um salva-vidas! Este método "mestre antes do espelho" corrigiu um problema com o Bitbucket sendo o destino e acreditando que um ramo diferente de "mestre" era o ramo principal.
Toddius Zho 17/08/19
12

Se você estiver movendo ramificações para um novo repositório de operações de um antigo e NÃO tiver todos os ramos de repositório antigos locais, será necessário rastreá-los primeiro.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Em seguida, adicione seu novo repositório remoto:

git remote add bb <path-to-new-repo>

Em seguida, você pode enviar todos usando este comando:

git push -u bb --all

Ou você pode configurar o repositório usando os comandos git config anotados nas outras respostas aqui, se você não estiver fazendo isso apenas uma vez ou estiver apenas procurando mover ramificações locais.

O ponto importante, as outras respostas apenas enviam todos os ramos LOCAIS. Se as ramificações existirem apenas em um repositório REMOTE alternativo, elas não se moverão sem rastreá-las primeiro. O loop for apresentado aqui ajudará nisso.

Lance Cleveland
fonte
BTW, estou usando "bb" no lugar de "origem" aqui porque presumo que seu repositório original / antigo tenha o nome "origem" e provavelmente ainda esteja anexado a esse rótulo. "bb" é para o Bitbucket, para onde mudei meu repositório original, mas você pode chamá-lo de algo mais aplicável, como "neworigin", se preferir.
Lance Cleveland
2
Isso não funcionou para mim. Terminou com todas as filiais remotas que rastreiam a mesma filial local: /
jhsowter
2
AFAIK, isso não deve funcionar, conforme comentário do @jhsowter. o comando certo para mim para rastrear um ramo remoto em um repo recém-clonada é git branch --track reponame origin/reponamecaso contrário você vai obter todas as filiais remotas rastreados na filial local atual
Pioneer céus
Alterei o snippet de repo-collection para git branch -r | grep -v '\->' | sed 's/ origin\///', que fornece apenas o nome da filial remota.
Paul Hicks
6

Para ver todos os ramos sem usar, git branch -avocê deve executar:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

Agora você pode ver todos os ramos:

git branch

Para empurrar todos os ramos, tente:

git push --all
tokhi
fonte
1
λ git fetch --all origem fatal: buscar --all não leva um argumento repositório
foxundermon
você está tentando git fetch --all?
tokhi 27/07/2015
4

Se você estiver movendo todas as ramificações para um novo repositório, de um antigo, no repositório local, precisará configurar o rastreamento de cada ramo para os ramos de origem existentes, antes de passar para o novo repositório, caso contrário, todos os ramos de origem não aparecerão em a nova origem. Faça isso manualmente, rastreando ou verificando cada ramificação, ou use o liner:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Esse comando de uma linha é baseado nas versões dele em outras respostas nesta página, mas é sem dúvida melhor porque:

  1. ele configura corretamente o rastreamento de ramificação, ao contrário de algumas variantes mais antigas deste comando nesta página, que fornecem apenas um parâmetro para - rastrear e, portanto, cada ramificação acaba rastreando o mestre - não é bom
  2. nomeia as ramificações locais sem o prefixo "origin /" que eu pessoalmente não quero - e é consistente com o que acontece quando você faz checkout de uma ramificação normalmente.
  3. pula o mestre de rastreamento, já que isso já está acontecendo
  4. na verdade, não faz checkout de nada, portanto, é rápido
  5. evita tropeçar no -> na saída do git branch -r

Em seguida, se você estiver alternando origens, substitua o link pela origem antiga e aponte para um novo controle remoto. Certifique-se de criar o novo controle remoto primeiro, usando a GUI do bitbucket / github, mas não inclua nenhum arquivo nele ou haverá um problema de mesclagem. Por exemplo

git remote set-url origin [email protected]:YOUR/SOMEREPO.git

Agora empurre. Observe que o segundo comando é necessário para enviar as tags também:

git push -u --all origin
git push --tags origin
Abulka
fonte
0

Solução sem codificação codificada origin na configuração

Use o seguinte em seu gitconfig global

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Isso empurra todos os ramos e todas as tags

Por que você NÃO deve codificar origin na configuração?

Se você codificar:

  1. Você terminará origincomo um controle remoto em todos os repositórios. Portanto, você não poderá adicionar origem, mas precisará usarset-url .
  2. Se uma ferramenta criar um controle remoto com um nome diferente, todas as configurações não serão aplicadas. Então você terá que renomear o controle remoto, mas renomear não funcionará porque originjá existe (do ponto 1) lembre-se :)

A busca já é resolvida pelo git moderno

De acordo com a resposta de Jakub Narębski:

Com o git moderno, você sempre busca todas as ramificações (como ramificações de rastreamento remoto no espaço de nomes refs / remotes / origin / *

Dheeraj Bhaskar
fonte