upstream - publish git tag




Configure o git para puxar e empurrar todos os ramos (6)

Solução sem origin hardcoding na configuração

Use o seguinte no seu gitconfig global

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

Isso empurra todas as ramificações e todas as tags

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

Se você codificar:

  1. Você vai acabar com a origin como um controle remoto em todos os repos. Assim, você não poderá adicionar origem, mas precisará usar o set-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 a origin já existe (do ponto 1) lembre-se :)

A busca é cuidada já pelo moderno git

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 namespace refs / remotes / origin / *

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 para isso?

Caso contrário, quando eu adicionar um novo branch, localmente e eu quero puxá-lo do servidor, qual é a maneira mais simples de fazer isso?

Eu criei um novo ramo com o mesmo nome e tentei puxar, mas não funciona. Me pergunta por toda a configuração remota do ramo. Como eu configuro isso?


A maneira mais simples é fazer:

git push --all origin

Isso vai empurrar tags e ramificações.


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 (ex. Push master first) enquanto CodeCommit do Atlassian Stash para o AWS CodeCommit (blank repo). Eu não tenho certeza do motivo, mas depois de empurrar ( git push new-origin --mirror ) a ramificação padrão estava se referindo a alguma outra ramificação que o master .


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

Tente apenas isto:

$ 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/*'

Se você está movendo ramos para um novo repo de um antigo e não tem todos os ramos de repo antigos locais, você precisará 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>

Então você pode empurrar todos usando este comando:

git push -u bb --all

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

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


Se você está movendo todas as filiais para um novo repo de um antigo, então em seu repositório local você precisa configurar o rastreamento de cada filial para filiais de origem existentes, antes de enviar para o novo repositório, caso contrário, todas as filiais de origem não aparecerão a nova origem. Faça isso manualmente rastreando ou verificando cada ramificação, ou use o único liner:

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

Este comando de uma linha é baseado em versões dele em outras respostas nesta página, mas é discutivelmente melhor porque:

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

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

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

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

git push -u --all origin
git push --tags origin






push