如何将GitHub上游合并为子模块?

时间:2014-02-06 09:35:16

标签: git github git-submodules

我有一个应用程序,其中包含一个Github存储库(vendor/one)作为子模块。我在Github上将vendor/one分叉到me/one以分享我的更改并发送拉取请求。

在本地,我将子模块设置为:

cd ~/Projects/app
git submodule add https://github.com/me/one.git Libraries/One
cd Libraries/One
git remote add upstream https://github.com/vendor/one.git

随着时间的推移......

  • 我有push origin master几次
  • vendor/one存储库
  • 中有一些新的提交

在某一点上,我想要与vendor/one合并以获取新功能和补丁,我还想保留me/one的提交。那么我打算做什么:

cd ~/Projects/app
cd Libraries/One
git branch temp
git checkout temp
git fetch upstream
git merge upstream/master
(conflicts expected)
(resolve conflicts)
(merge temp with master)
push origin master

上述工作流程是否有意义?某处有教程或最佳实践吗?

2 个答案:

答案 0 :(得分:2)

我建议使用rebasing而不是在这里合并:你在上游/ master上重放你的提交,保留master的历史记录作为upstream/master的镜像(以及你自己的所有提交) 。
这也将使未来的pull请求变得微不足道,因为您的提交将仅仅位于最新版本的upstream/master之上。

这将涉及推送,但由于它是你的分支,你很可能是该回购的唯一贡献者。

cd ~/Projects/app
cd Libraries/One
git fetch upstream
git rebase upstream/master
(conflicts expected)
(resolve conflicts)
push -f origin master

答案 1 :(得分:0)

<强>子模

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

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

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

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

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