将上游设置为子模块(或如何将GitHub fork作为子模块包含)

时间:2012-06-17 07:31:27

标签: git github git-submodules

我对这个Git事情很陌生,需要一些帮助。

我最近在GitHub上创建了一个新的repo并将其克隆到我的桌面上。我们称之为 myProject 。我的GitHub帐户中也有一个fork,我将其作为子模块包含在myProject中。我们称之为 myForkOfOtherProject ,这是 otherProject 的分支。

所以,这是目前的情况:

Graph of the current state of repos

According to GitHub

  

当克隆了一个repo时,它有一个名为 origin 的默认远程   指向GitHub上的fork,而不是它分叉的原始repo   从。要跟踪原始仓库,您需要添加另一个仓库   远程名为上游

所以,我的问题是,如何将上游设置为子模块?或者我不明白什么?

提前谢谢。

2 个答案:

答案 0 :(得分:8)

子模

将子模块克隆到存储库时,它将拥有自己的 .git / config 文件及其自己的 origin 概念。假设子模块是您的(例如,您的遥控器上游没有第三方存储库),那么您不必担心为子模块创建上游远程。

如果你需要为你的子模块创建一个上游遥控器,这很容易。只需cd进入子模块的顶级目录,并按照与主存储库相同的方式给它一个。

cd myForkOfOtherProject
git remote add upstream git://example.com/otherProject.git

没有命名空间冲突,因为子模块实际上只是一个普通的git存储库,在超级项目中跟踪了一些额外的元信息。超级项目和子模块不共享 .git / config 文件。

出于所有意图和目的,您可以像处理任何其他存储库一样处理子模块中的 origin upstream 。您在子模块中运行的Git命令独立于超级项目,超级项目主要关注跟踪子模块的当前提交ID。

答案 1 :(得分:2)

git remote add upstream git://github.com/otherUser/otherProject.git

仅在git协议(默认情况下为端口9478)被理论化时才有效 我无法从工作中做到这一点(我甚至没有提到ssh地址:ssh也被禁止从“局域网外”远程地址工作。)

git remote add upstream https://github.com/otheruser/otherProject.git

将有效(提供some additional settings

注意:在子模块仓库中创建上游(CodeGnome described,upvoted)对于update that submodule with the latest of otherProject

非常有用
cd myForkOfOtherProject
git fetch upstream
# or fetch + merge:
git pull upstream

它不会用于你推回到其他项目(如果你分叉它,可能是因为你没有被列为合作者)。
如果你直接在myForkOfOtherProject中进行任何演化,你将需要提交它,然后转到父repo并提交它(参见“true nature of submodules”)。如果您希望初始otherProject维护者考虑到这一点,请创建一个pull request