如何将一个只读的 git 克隆从 github 转换成一个分叉的 git 克隆

我经常遇到这个问题。

假设我确实按照下面的步骤阅读了 Rail 的源代码,因为我遇到了一些问题。

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

在研究期间,我测试了一些东西,现在我有一个修复,我想轨道核心团队看看。如何将所做的更改推送到 Rails 的分叉版本。

请记住,当我克隆时,我没有克隆一个分支版本,而是一个只读版本。

我并不是反对用叉子。只是有时候我想我只是去浏览,然后我想添加一些东西。

8672 次浏览

这不重要。您可以添加另一个远程,指定您的非分叉回购,如果您愿意。把你的改动推进去。

当你克隆一个回购协议时,它会自动设置一个称为 origin的远程协议,这个远程协议指的是你所克隆的回购协议。现在指向上游 Rails 项目,但是您需要创建您自己的 fork,然后设置一个指向它的远程程序,以便您可以推向它。

第一步是点击上游 GitHub 项目页面上的“ Fork”按钮(图片来自 GitHub 分叉指南) :

GitHub fork button

一旦你这样做了,找到并复制该回购的 URL。确保使用具有读写访问权限的 SSH URL。它应该类似于 git@github.com:nadal/rails.git,假设您的用户名是 nadal

现在您可以创建远程,它允许 Git 跟踪远程存储库,根据您拥有的访问权限从中提取或推送到远程存储库。您可以选择将 origin替换为您将要推送到的那个(这是有多少人设置了它) ,或者将 origin指向上游,而是创建一个新的远程。我将演示如何进行第一个设置; 第二个设置应该很容易解决。

要将 origin更改为指向 GitHub 上的 fork,您可能希望将上游分支保留在某个位置,因此将其重命名为 upstream:

git remote rename origin upstream

现在创建一个指向您的叉子的新遥控器:

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

现在你应该能够推到你的新分叉:

git push origin master

一旦您对推送到 GitHub 的更改感到满意,并且希望 Rails 团队中的某个人来看看它,那么您有两个选择。一种是使用 GitHub 对 发送请求进行操作; 有关操作方法,请参阅那里的文档。但是,如果您只有一个或几个小补丁,Rails 团队希望您使用 制作一张灯塔门票并附加补丁; 请参阅 对 Rails 的贡献上的说明以获得更多信息。

编辑 这里有一个图表来指示正在发生的事情。你所做的只是简单地克隆上游轨道回购,所以现在你有你自己的回购在你自己的机器上,这是指 git://github.com/rails/rails.git作为 origin:

Github:    git://github.com/rails/rails.git
^
|
Remotes:          origin
|
Your machine:     rails/

如果你先用叉子,然后复制你的叉子,你会得到这样的结果:

Github:    git://github.com/rails/rails.git <-- git@github.com:nadal/rails.git
^
|
Remotes:                                                origin
|
Your machine:                                           rails/

如果你听从我的指示,你会得到这样的结果:

Github:    git://github.com/rails/rails.git <-- git@github.com:nadal/rails.git
^                                  ^
|                                  |
Remotes:            upstream                            origin
|                                  |
Your machine:           \-------------------------------rails/

这个版本和你通过分叉得到的版本一样,只不过它也有一个 upstream遥控器,这样你就可以跟踪官方的更改,并将它们合并到你的代码中(如果你已经创建了分叉版本,你可能也想添加 upstream遥控器)。

或者,如果您不想使用 fork,根据维护团队的不同,您可以创建一个补丁并提交给他们。 一般来说,你可以按照其他评论中的解释,通过分叉到 github,或者通过自己的 git repo,向原来的 repo 的维护者提供你希望他们合并的信息给你的 repo 和分支。

从克隆模式切换到分叉模式的一个非常简单的方法是使用来自 http://hub.github.com/hub包装器。

安装完成后,只需运行

hub fork

从你的只读克隆体内部。