如何从原始存储库的副本中插入叉?


122

我在GitHub上创建了myrepo另一个存储库(简称为)的fork(叫它orirepo)。后来,我克隆了orirepo

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

我修改了约20个文件,然后进行了更改并进行了提交

git add
git commit

但是,当我试图推动

git push

我收到此错误:

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

我知道我犯了一个错误:我应该克隆fork而不是orirepo,但是现在为时已晚。我怎么能推我的叉子而不是origin/orirepo我没有写权限的?

Answers:


187

默认情况下,克隆存储库时

  • 位于https://github.com/original/orirepo.git
  • 其当前分支叫master

然后

  • 生成的克隆的本地配置仅列出一个名为的远程站点origin,该远程站点与您克隆的存储库的URL相关联;
  • master克隆中的本地分支设置为track origin/master

因此,如果您不修改克隆的配置,则Git会解释

git push

git push origin master:origin/master

换句话说,git push尝试将您的本地master分支推送到master位于远程存储库中的分支(您的克隆称为origin)。但是,不允许这样做,因为您没有对该远程存储库的写权限。

你需要

  1. origin通过运行以下命令重新定义要与fork关联的遥控器

    git remote set-url origin https://github.com/RemiB/myrepo.git
    
  2. 或者,如果您想保留origin远程的原始定义,请定义一个myrepo与fork关联的新远程(此处称为):

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

    然后,您应该可以master通过运行将本地分支推送到fork

    git push myrepo master
    

    而且,如果您要告诉Git git push应该推送到myrepo而不是origin从现在开始,则应该运行

    git push -u myrepo master
    

代替。


git push -u也会改变git pull的默认行为吗?
Benroth

1
是的,因此,不要执行push-u,而应使用pushDefault选项:git config --add remote.origin.pushdefault myrepo,它将仅影响推送,并应用于所有现有的新分支。
Marius K

1
的确git remote set-url origin http://github.com/myname/reponame,然后git push origin mybranch。工作了!谢谢!
开发人员MariusŽilėnas17年

1
如果使用添加遥控器,它将如何影响拉力?它从哪里来?如何处理两个回购协议之间的未来合并?
Kok How Teh,

1
@KokHowTeh添加另一个远程不会影响本地分支跟踪哪个远程分支(如果有)。但是,git push -u myrepo master使您的本地主服务器开始跟踪myrepo/master。如果在此之后git pull在master上运行时,您将从退出myrepo,而不再从退出origin
jub0bs

17

因此,您克隆了某人的存储库进行了更改,然后意识到您不能推送到该存储库,但可以推送到自己的fork。因此,您继续进行操作,并分叉了原始存储库。

您所要做的就是将本地克隆中的原始URL替换为分叉存储库的URL。

像这样做

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

https://github.com/fork/name.git您来自原始存储库的fork的URL 在哪里。

之后,就

git push

然后您就可以将更改推送到分叉了:)


7

好吧,我终于编辑了git config文件:

$ nano .git/config

变化:

[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

[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

然后,

$ git push

像魅力一样工作。

或者,感谢Thiago F Macedo回答

git remote set-url origin https://yourusername@github.com/user/repo.git

-5

您应该首先在您的帐户中克隆叉式仓库。

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

您绝对有权推送到此存储库。如果要将代码推送到原始存储库,则可以发出拉取请求。


他们不要求克隆叉子。请再次阅读问题。
艾哈迈德·阿威斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.