我有一个应用程序,其中包含一个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
上述工作流程是否有意义?某处有教程或最佳实践吗?
答案 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。