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?

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.


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 :)


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://yourusername@github.com/user/repo.git

-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.


Eles não estão pedindo para clonar o garfo. Por favor, leia a pergunta novamente.
Ahmad Awais de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.