Alterando o padrão 'push para' remoto do Git

228

Quero alterar o destino padrão da filial remota do Git para que eu possa

git push

Ao invés de:

git push upstream

Atualmente, isso está definido para o controle remoto de origem e quero defini-lo para um controle remoto diferente.

Tentei remover o controle remoto original (clonado de)

git remote rm origin

O que removeu o controle remoto original. Mas não resolve o git pushproblema. Eu ainda recebo:

fatal: nenhum destino de envio configurado. Especifique o URL na
linha de comando ou configure um repositório remoto usando ...

Eu também tentei brincar com:

git remote set-url --push myfork origin

e outras opções, mas nenhuma parece funcionar (talvez porque eu tenha excluído o controle remoto de origem muito cedo?)

Seguindo a resposta aqui , tentei mudar:

git config push.default upstream (or matching)

mas nem funcionou.

alonisser
fonte

Respostas:

215

Você pode usar git push -u <remote_name> <local_branch_name>para definir o upstream padrão. Veja a documentação do git push para mais detalhes.

1615903
fonte
1
Não funciona: recebo '' 'fatal:' origin 'não parece ser um repositório git fatal: A extremidade remota desligou inesperadamente' '' talvez porque excluí a origem remota antes de prosseguir. acabou de encontrar uma solução de trabalho, eu vou atualizar em uma resposta
alonisser
34
Como um esclarecimento adicional, a sintaxe deve ser git push -u <remote_name> <local_branch_name>:<corresponding_remote_branch_name>.
Marco Lazzeri
33
Exemplo: git push -u origin master:master.
starbeamrainbowlabs
1
Depois de definir um controle remoto padrão ... de qualquer maneira você pode forçar o git pushenvio remoto da ramificação local atual? Quero dizer, isso significa que tenho que executar este comando para cada ramo. Certo? Não posso simplesmente fazer uma configuração inicial para todo o repositório? @MarcoLazzeri
Honey
2
@starbeamrainbowlabs Não é git push -u origin mastersuficiente? Você está apenas ilustrando a sintaxe completa?
Josiah Yoder
108

Para alterar qual controle remoto upstream está "conectado" à sua filial, use o git branchcomando com o sinalizador de configuração upstream.

Verifique se o controle remoto existe primeiro:

git remote -vv

Defina o controle remoto preferido para a ramificação atual (com saída):

git branch --set-upstream-to <remote-name>

Valide se a ramificação está configurada com o controle remoto upstream correto:

git branch -vv

Jordan McCullough
fonte
2
Apenas tentei git branch --set-upstream-to myforke obtive um erro:> error: unknown option `set-upstream-to 'Estou executando o git 1.7.9
alonisser 15/09/13
3
A sintaxe foi alterada em 1.8, consulte stackoverflow.com/questions/520650/…
jtniehof 7/15
1
Veja a seguinte resposta: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich
10
git branch -u <remotename>/<branch>trabalhou para mim. O comando foi executado com o ramo de interesse local verificado. Veja 'Rastreando ramos' em git-scm.com/book/it/v2/Git-Branching-Remote-Branches
norio
2
O comando remoto verbose output é realmente apenas git remote -vou git remote --verbose. O -vvv extra do redundante.
Artif3x
45

Trabalhando com Git 2.3.2 ...

git branch --set-upstream-to myfork/master

Agora status, pushe pullsão apontados para myforkcontrole remoto

pinei
fonte
Isso funciona quando você também deseja definir o padrão pull.
precisa saber é o seguinte
39

Você pode alterar facilmente o controle remoto padrão para ramificações de uma só vez simples usando este comando

git push -u <remote_name> --all
Mykola Denysyuk
fonte
14
Apenas para observar, isso empurrará todos eles, além de alterar o controle remoto de upstream.
poolie
16

Se você fez git push origin -u localBranchName:remoteBranchNamee, em git pushcomandos sequenciais , obtém erros que, em seguida, a origem não existe, siga estas etapas:

  1. git remote -v

Verifique se há algum controle remoto que eu não ligo. Exclua-os comgit remote remove 'name'

  1. git config --edit

Procure possíveis sinais de um controle remoto antigo / inexistente. Procure pushdefault:

[remote]
  pushdefault = oldremote

Atualize o oldremotevalor e salve.

git push deve funcionar agora.

Șerban Ghiță
fonte
2
Obrigado! Costumo acrescentar -uao usar git pushum controle remoto diferente devido à memória muscular. Isso torna o controle remoto o padrão, configurando-o novamente usando git config --edit(ou pressionando novamente e configurando um novo controle remoto) resolvido o problema.
Tim Visée 20/03/19
13

Apenas um esclarecimento (usando a versão 1.7.9.5 do git no ubuntu 12.04):

O Git irá adicionar / remover controles remotos. Essas são instâncias remotas do git com um servidor conectado.

git remote add myremote git://remoteurl

Você pode buscar o repositório git da seguinte maneira:

git fetch myremote

Parece que isso cria um ramo chamado 'myremote', no entanto, o controle remoto para o ramo não é definido automaticamente. Para fazer isso, você deve fazer o seguinte:

Primeiro, verifique se você tem esse problema, ou seja,

git config -l | grep myremote

Você deve ver algo como:

remote.myremote.url=git://remoteurl
remote.myremote.fetch=+refs/heads/*:refs/remotes/myremote/*
branch.myremote.remote=.
branch.myremote.merge=refs/heads/master

Se vir branch.myremote.remote=., você deve prosseguir:

git config branch.myremote.remote myremote
git checkout myremote
git pull

Agora você deve estar atualizado com o repositório remoto e seus pull / pushes devem estar vinculados ao controle remoto apropriado. Você pode alternar os controles remotos dessa maneira, por filial . [Nota 1]

De acordo com a documentação oficial de configuração do Git , você pode configurar uma ramificação push padrão (basta pesquisar remote.pushdefault nessa página), no entanto, lembre-se de que isso não afetará repositórios / ramificações que já existem, portanto, isso funcionará apenas para novos repositórios / ramificações. Você deve se lembrar que --globaldefinirá padrões de repositório específicos do usuário (~ / .gitconfig),--system definirá padrões de repositório em todo o sistema (/ etc / gitconfig) e nenhum sinalizador definirá opções de configuração para o repositório atual (./.gitconfig).

Também deve ser observado que a opção de configuração push.default é para configurar o comportamento ref-spec , não remoto comportamento .

[1]: git branch --set-upstream myotherremotenormalmente funcionaria aqui, no entanto o git irá reclamar que não definirá um ramo como seu próprio controle remoto se git branch --set-upstream myremotefor usado. No entanto, acredito que esse seja um comportamento incorreto.

smaudet
fonte
Em vez de git config -l | grep myremote, você pode simplesmente usar: #git config --get branch.myremote.remote
Murmel
@Murmel primeiro, este é um wiki da comunidade, então sinta-se livre para melhorar, em segundo lugar, --getassume um comportamento específico, anotei que existem outras maneiras de configurar fluxos de transmissão, mas isso fornece uma maneira de encontrar as informações sem depender apenas das ferramentas git corrigir. O Git não é perfeito, é melhor entender os dados, o que ele faz e depois esperar que suas invocações funcionem adequadamente.
Smaudet
10

Pode ser útil dar uma olhada no .git/configinterior do seu repositório, ele listará todos os controles remotos e também o controle remoto padrão para cada filial

por exemplo.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = [email protected]:fii/web2016.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "bugfix/#8302"]
    remote = origin
    merge = "refs/heads/bugfix/#8302"
[branch "feature/#8331"]
    remote = origin
    merge = "refs/heads/feature/#8331"
[remote "scm"]
    url = https://scm.xxx.be/git/web2016bs.git
    fetch = +refs/heads/*:refs/remotes/scm/*

você pode fazer alterações manuais neste arquivo para remover um controle remoto indesejado ou atualizar os controles remotos padrão para os diferentes ramos que você possui

  • Preste atenção! ao alterar ou remover os controles remotos, atualize todas as referências a ele neste arquivo de configuração
Kim Paulissen
fonte
5

Outra técnica que encontrei para resolver isso (mesmo que eu tenha excluído a origem primeiro, o que parece ser um erro) está manipulando o git config diretamente:

git config remote.origin.url url-to-my-other-remote
alonisser
fonte
5
Esta não é uma boa solução, os usuários do git devem ser capazes de extrair / enviar de vários repositórios - embora isso permita alterar o controle remoto do original, isso não significa que você DEVE alterar o controle remoto do original, pois isso provavelmente significa que há existem várias incompatibilidades entre controles remotos. A mesclagem ajudará aqui, mas é mais simples e preserva mais histórico para definir o controle remoto na nova ramificação.
precisa saber é
Não a maneira correta de fazê-lo ... @ resposta de Jordan é mais apropriado
Raja Anbazhagan
1
Veja também: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich
5

Muito simplesmente, e juntando alguns dos ótimos comentários aqui, juntamente com minha própria pesquisa sobre isso.

Primeiro, verifique o ramo local que você deseja vincular ao seu ramo remoto:

git checkout mybranch

Próximo:

git branch -u origin/mybranch

Onde:

git branch -u {remote name}/{branch name}

Você deve receber uma mensagem:

"Branch mybranch set up to track remote branch mybranch from origin."
Artif3x
fonte
3

No meu caso, eu corrigi o seguinte: * run git config --edit * No arquivo de configuração do git:

[branch "master"]
remote = origin # <--- change the default origin here
Ron
fonte
0

git remote set-url --push origin deve funcionar, como você mencionou, mas você precisa fornecer explicitamente o URL em vez de um nome remoto alternativo, por exemplo

git remote set-url --push origin [email protected]:contributor/repo.git

Você pode confirmar se isso funcionou fazendo a git remote -v. Por exemplo

λ ~/go/src/github.com/stretchr/testify/ master git remote -v
fork    [email protected]:contributor/testify.git (fetch)
fork    [email protected]:contributor/testify.git (push)
origin  [email protected]:stretchr/testify (fetch)
origin  [email protected]:contributor/testify.git (push)
be_es
fonte