我可以使用`git subtree split`来维护项目子目录的“fork”吗?

时间:2014-05-28 22:57:58

标签: git version-control open-source git-subtree

简而言之,我想" 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"每个主要上游分支的分支(更不用说能够引用上游标记)。

有没有更好的方法来解决这个问题?

1 个答案:

答案 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有很多提交,而且实际上需要花费一个小时才能运行。如果您需要,我也可以为您提供有关如何帮助的详细信息。 (只需发表评论,我将更新此答案)。