简而言之,我想" fork"另一个项目(不在我的控制下)的子目录到新存储库的顶层,并对该子目录中的代码进行了增强,同时保留了从上游项目子目录中更改合并的能力。
我已经在这个主题上读了一段时间,但无法找到适合我情况的答案。 git subtree
的大多数用法都分解为这些情况:
git subtree add
这些用例并不适用于我:我没有忘记忘记,而且我不拥有此分支的两面,因此git subtree add
流程不是&{ #39; t适用。
因此,让我们说原始模块位于主项目中的contrib/foo
。我目前的想法是:
git subtree split -P contrib/foo -b upstream_vx.y
创建一个新的历史记录" hoists"子目录直到存储库的顶级master
分支,从这一点开始增强upstream_vx.y
git subtree split
upstream_vx.y
合并到我的master
这并不像git-like"对我来说。具体来说,我基本上创建了上游项目子目录的并行历史记录,并维护了我自己的" hoisted"每个主要上游分支的分支(更不用说能够引用上游标记)。
有没有更好的方法来解决这个问题?
答案 0 :(得分:5)
我想我一直在和你保持类似的情况。我有一个主要项目(ProjA),它有模块,我将第二个项目(ProjB)的子树添加到主要模块中。为了实现这一点,我保留了一份副本ProjB。
拆分ProjB:
cd ProjB
git checkout -b split-maint
git subtree split --prefix=important/dir --branch=module-for-A
将子树添加到ProjA:
cd ProjA
git remote add ProjB_remote /path/to/ProjB
git fetch ProjB_remote
git subtree add --prefix=modules/projB_mod ProjB_remote/module-for-A --message="commit message"
然后更新/维护,重新拆分原件(如上所述)。这里的关键是 git子树拆分是可重复的,之前拆分的每个修订版的SHA都是相同的。
使用新的详细信息更新ProjA:
cd ProjA
git fetch ProjB_remote
git subtree merge --prefix=modules/projB_mod ProjB_remote/module-for-A --message="commit message"
从技术上讲,我的做法略有不同,因为我的ProjB有很多提交,而且实际上需要花费一个小时才能运行。如果您需要,我也可以为您提供有关如何帮助的详细信息。 (只需发表评论,我将更新此答案)。