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

jas*_*p85 12 git version-control open-source git-subtree

总之,我想"叉"另一个项目的子目录(不在我的控制),以一个新的存储库的顶层,并增强在该子目录中的代码,同时保留变动合并从子目录中的能力上游项目.

我一直在读这个话题一段时间,但找不到我的情况的确定答案.git subtree分解为这些情况的大多数用法:

  • 项目的子目录正在作为自己的单独项目分离出来.父项目完全删除子目录,新项目过着自己的生命.
  • 父项目的维护者希望允许按照自己的条件维护子目录,并将其转移到自己的存储库中,然后使用该存储库将其添加回主项目 git subtree add

这些用例不适用于我:我不会忘记忘记,而且我不拥有此fork的两面,所以git subtree add流程不适用.

所以我们假设原始模块存在于contrib/foo主项目中.我目前的想法是:

  • 使用git subtree split -P contrib/foo -b upstream_vx.y创建一个新的历史,"笼"子目录到一个存储库的顶层
  • master从我的项目创建一个分支,从这一点开始增强
  • 偶尔upstream_vx.y运行继续更新git subtree split
  • 当我需要一个bug修复或来自上游的什么时,合并upstream_vx.y到我的master

这对我来说并不像"git-like".具体来说,我基本上创建了上游项目子目录的并行历史记录,并为每个主要上游分支维护我自己的"提升"分支(更不用说能够引用上游标记).

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

Mik*_*ike 5

我想我一直在和你保持类似的情况。我有一个具有模块的主项目(ProjA),并且正在将第二个项目(ProjB)的子树添加到主项目的模块中。为此,我维护了一个ProjB副本。

分割ProjB:

cd ProjB
git checkout -b split-maint
git subtree split --prefix=important/dir --branch=module-for-A 
Run Code Online (Sandbox Code Playgroud)

将子树添加到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"
Run Code Online (Sandbox Code Playgroud)

然后要更新/维护,请重新分割原稿(如上所述)。这里的关键是git subtree split是可重复的,并且以前拆分的每个修订版的SHA都相同。

使用新的详细信息更新ProjA:

cd ProjA
git fetch ProjB_remote
git subtree merge --prefix=modules/projB_mod ProjB_remote/module-for-A --message="commit message"
Run Code Online (Sandbox Code Playgroud)

从技术上讲,我的操作略有不同,因为我的ProjB有很多提交,并且拆分实际上需要一个小时才能运行。如果您需要,我也可以为您提供有关如何帮助的详细信息。(只需评论,我将更新此答案)。