Como posso enviar para meu fork a partir de um clone do repositório original?

122

Eu criei um fork (vamos chamá-lo myrepo) de outro repositório (vamos chamá-lo orirepo) no GitHub. Mais tarde, eu clonado orirepo.

git clone https://github.com/original/orirepo.git

Modifiquei cerca de 20 arquivos, então testei minha mudança e fiz um commit

git add
git commit

No entanto, quando tentei empurrar

git push

Eu tenho este erro:

remote: Permission to original/orirepo.git denied to mylogin.
fatal: unable to access 'https://github.com/original/orirepo.git/': The requested URL returned error: 403

Sei que cometi um erro: deveria ter clonado meu garfo em vez disso orirepo, mas agora é tarde para isso. Como posso enviar para meu fork em vez de origin/orirepo, para o qual não tenho acesso de gravação?

Rémi Becheras
fonte

Respostas:

187

Por padrão, quando você clona um repositório

  • que reside em https://github.com/original/orirepo.git,
  • cujo branch atual é chamado master,

então

  • a configuração local do clone resultante lista apenas um remoto chamado origin, que está associado à URL do repositório que você clonou;
  • o masterbranch local em seu clone está configurado para rastrear origin/master .

Portanto, se você não modificar a configuração do seu clone, o Git interpretará

git push

Como

git push origin master:origin/master

Em outras palavras, git pushtenta enviar seu masterbranch local para o masterbranch que reside no repositório remoto (conhecido por seu clone como origin). No entanto, você não tem permissão para fazer isso, porque você não tem acesso de gravação a esse repositório remoto.

Você precisa

  1. redefina o origincontrole remoto para ser associado ao seu fork, executando

    git remote set-url origin https://github.com/RemiB/myrepo.git
    
  2. ou, se você deseja preservar a definição original do origincontrole remoto, defina um novo controle remoto (chamado myrepo, aqui) que está associado ao seu fork:

    git remote add myrepo https://github.com/RemiB/myrepo.git
    

    Então você deve ser capaz de enviar seu masterbranch local para o fork executando

    git push myrepo master
    

    E se você quiser dizer ao Git que git pushdeve fazer push para em myrepovez de a originpartir de agora, você deve executar

    git push -u myrepo master
    

em vez de.

jub0bs
fonte
o ´git push -u´ também mudará o comportamento padrão do ´git pull´?
Benroth
1
Sim, irá, então ao invés de fazer "push -u", você deve usar a opção pushDefault: git config --add remote.origin.pushdefault myrepo e só afetará o push e se aplica a todos os novos branches existentes.
Marius K
1
Fez git remote set-url origin http://github.com/myname/reponamee depois git push origin mybranch. Funcionou! Obrigado!
Desenvolvedor Marius Žilėnas
1
Se add remote for usado, como isso afeta o pull? De onde vem isso? Como ele lida com a fusão futura entre os 2 repos?
Kok How Teh
1
@KokHowTeh Adicionar outro controle remoto não afeta qual branch remoto (se houver) um branch local rastreia. No entanto, git push -u myrepo masterfaz com que seu mestre local comece a rastrear myrepo/master. Se, depois disso, você correr git pullno master, você irá puxar de myrepo, e não mais origin.
jub0bs
17

Então, você clonou o repo de alguém, fez as alterações e percebeu que não pode enviar para esse repo, mas pode enviar para seu próprio fork. Então, você foi em frente e bifurcou o repositório original.

Tudo que você precisa fazer é trocar a URL de origem em seu clone local pela URL de seu repositório bifurcado.

Faça isso deste modo

git remote set-url origin https://github.com/fork/name.git

Onde https://github.com/fork/name.gitestá o URL de seu fork do repo original.

Depois disso, apenas

git push

e você poderá enviar suas alterações para o fork :)

Ahmad Awais
fonte
7

Ok, finalmente editei meu arquivo de configuração git:

$ nano .git/config

mudando:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = https://github.com/<origin-project>/<origin-repo>.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

para

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = https://github.com/<mylogin>/<myrepo>.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

Então,

$ git push

Funcionou como um encanto.

Ou, graças à resposta de Thiago F Macedo :

git remote set-url origin https://[email protected]/user/repo.git
Rémi Becheras
fonte
-5

Você deve clonar o repositório bifurcado em sua conta primeiro.

git clone https://github.com/your_account/repo.git

Você tem absolutamente permissão para enviar para este repositório. Se você deseja enviar seu código ao repositório original, pode emitir uma solicitação pull.

LeonF
fonte
Eles não estão pedindo para clonar o garfo. Por favor, leia a pergunta novamente.
Ahmad Awais de