如何将只读git克隆从github转换为分支


79

我不时遇到这个问题。

假设我确实遵循以下步骤来阅读Rails的源代码,因为我遇到了一些问题。

git clone git://github.com/rails/rails.git

在研究过程中,我测试了一些东西,现在有一个修复程序,我想让Rails核心团队研究一下。如何将更改推送到分叉的Rails版本。

记住,当我克隆时,我没有克隆派生版本,而是克隆了只读版本。

不是我反对分叉。只是有时候我认为我只是要浏览,然后才想添加一些东西。


我想检查一下,看看我的答案是否对您有用,或者您是否仍然需要更多信息。如果您需要进一步的说明或澄清,请告诉我,我会尽力帮助您。如果不是,您可能希望接受回答以表明问题已得到充分回答。
布赖恩·坎贝尔

Answers:


112

克隆存储库时,它将自动设置一个名为的远程目录origin,它引用您已克隆的存储库。现在这指向上游的Rails项目,但是您需要创建自己的派生对象并推送到该分支,然后设置一个指向该分支的遥控器,以便您可以推送到该分支。

第一步是单击上游GitHub项目页面上的“ Fork”按钮(来自GitHub上有关分叉的说明的图片):

GitHub分支按钮

完成此操作后,找到并复制该仓库的URL。确保使用具有读写访问权限的SSH URL。它应该是这样的git@github.com:nadal/rails.git,假设你的用户名nadal

现在,您可以创建远程服务器,这使Git可以跟踪远程存储库,从远程存储库中提取或推入远程存储库,具体取决于您具有的访问权限。您可以选择将其替换origin为要推送的对象(设置了多少人),也可以origin指向上游,而创建一个新的遥控器。我将展示如何进行第一次设置。第二个应该很容易弄清楚。

要更改origin为指向GitHub上的fork,您可能需要将上游分支保留在某个地方,因此将其重命名为upstream

git remote rename origin upstream

现在创建一个新的远程指向您的fork:

git remote add -f origin git@github.com:nadal/rails.git

现在,您应该可以使用新的分叉了:

git push origin master

一旦对更改感到满意,就可以将其推送到GitHub,并希望Rails团队的人来看看它,您有两种选择。一种是使用GitHub发送拉取请求;请参阅那里的文档,了解如何执行此操作。但是,如果您只有一个或几个小补丁,Rails团队会希望您创建一个Lighthouse票证并附加补丁;有关更多信息,请参见有关对Rails进行贡献的说明。

编辑这是一个图表,指示正在发生的事情。您要做的只是克隆上游rails回购;所以现在你有自己的回购自己的机器,它是指在git://github.com/rails/rails.gitorigin

GitHub:git://github.com/rails/rails.git
                    ^
                    |
遥控器:起源
                    |
您的机器:滑轨/

如果分叉然后克隆叉子,您将获得以下信息:

GitHub:git://github.com/rails/rails.git <-git@github.com:nadal / rails.git
                                                           ^
                                                           |
遥控器:起源
                                                           |
您的机器:滑轨/

如果您按照我的指示进行操作,将获得以下信息:

GitHub:git://github.com/rails/rails.git <-git@github.com:nadal / rails.git
                        ^^
                        | |
遥控器:上游来源
                        | |
您的机器:\ ------------------------------- rails /

就像您通过分叉得到的版本一样,除了它还具有一个upstream遥控器,因此您可以跟踪正式的更改并将其合并到您的代码中(如果您创建了分叉的版本,则可能希望将upstream遥控器添加为好)。


您可能实际上并不希望分叉,如果按照原始发布者的说法,他有时可能想保存一些工作,而没有与原始发布者的任何链接。
亚当·迪米特鲁克

1
@adymitruk不,OP提到他有时会克隆上游仓库而不进行分叉,但随后希望回馈。他特别提到他想将他的更改推送到派生的Rails版本中。他没有说要保存工作而没有任何原始链接。
布莱恩·坎贝尔

他可能想成为实际项目的贡献者,然后如果他不想分叉……那是不可能的。
亚当·迪米特鲁克

感谢您的回答,对于我的耽搁,我们深表歉意。正如我提到的,我没有拨叉。我只有一个克隆。但是,您的答案假设我首先分叉了。我说对了吗?
尼克·范德比尔特

4
@Nadal我的答案并不假定您已经创建了一个fork。我的答案说明了如何将您刚刚克隆了一个存储库的情况转换为可以将本地存储库中的更改推送到分支的情况。在GitHub上分叉一个仓库仅在您可以推送到的服务器上复制一份;完成此操作后,我的说明将向您展示如何指向您创建的本地存储库(现在指向官方的Rails存储库),而不是指向您的fork。我添加了一个图表以指示发生了什么。希望对您有所帮助,如有其他问题,请告诉我。
布赖恩·坎贝尔


1

没关系。如果愿意,您可以添加另一个远程服务器,指定您的非分叉存储库。将您的更改推送到该位置。


如何添加另一个遥控器。抱歉。git world的新手。
尼克·范德比尔特

1
您可以稍后进行分叉,然后推送到您的分叉存储库中,以防万一您尚未分叉。分叉让你的仓库中自己的“副本”你感兴趣的
亚当Dymitruk

现在,您只需在github上创建一个新的仓库即可。将其添加为您从rails repo克隆的副本的远程对象,并仅推送至新的副本。我想这就是你所追求的。无需分叉。
亚当·迪米特鲁克

1
git remote add myrepo git://github.com/myid/mynotforkedrepo.git
Adam Dymitruk,2010年

您是否在github(或其他地方)上创建了自己的存储库?
亚当·迪米特鲁克

0

或者,如果您不想分叉,并且取决于维护团队,则可以创建补丁并将其提交给他们。通常,尽管您可以按照其他注释中的说明通过在github上进行分叉来使您的存储库可用,也可以在您自己的git repo上使存储库可用,并为原始存储库的维护者提供信息到您希望它们合并的存储库和分支中。


1
我不明白为什么人们不希望分叉,因为它只是一个简单的叉子!它不是项目的全新版本-只是您希望合并的源代码副本。就像补丁系列一样。
替代

1
该人可能没有Github帐户,但仍想为该项目做贡献。他们可以克隆项目,进行编辑,然后将修补程序或其分支提交到原始项目以包含在内。但真正有没有真正的理由,如果你不能到餐桌。
Svenito
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.