【问题标题】:Can I use `git subtree split` to maintain a "fork" of a project's subdirectory?我可以使用 `git subtree split` 来维护项目子目录的“分叉”吗?
【发布时间】:2014-07-18 08:39:49
【问题描述】:

简而言之,我想将另一个项目(不在我的控制之下)的子目录“分叉”到新存储库的顶层,并对该子目录中的代码进行增强,同时保留合并来自上游项目中的子目录。

我已经阅读该主题已有一段时间了,但找不到适合我情况的确切答案。 git subtree 的大部分用法可以分为以下几种情况:

  • 项目的一个子目录被分拆为它自己的独立项目。父项目将完全删除子目录,新项目将过上自己的生活。
  • 父项目的维护者希望允许按照自己的条件维护子目录并将其拆分到自己的存储库中,该存储库使用git subtree add 添加回主项目

这些用例不适用于我:我不是一劳永逸的,而且我不拥有这个分叉的两边,所以git subtree add 流程不适用。

假设原始模块位于主项目的contrib/foo 中。我目前的想法是:

  • 使用git subtree split -P contrib/foo -b upstream_vx.y 创建一个新的历史记录,将子目录“提升”到存储库的顶层
  • 从我的项目中创建一个 master 分支,并从这一点进行增强
  • 通过偶尔运行git subtree split 来不断更新upstream_vx.y
  • 当我需要来自上游的错误修复或其他问题时,将upstream_vx.y 合并到我的master

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

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

【问题讨论】:

  • 我提到的“常用用例”描述为here,即拆分一个子目录并使用git subtree add 将其添加到主项目中。我认为最后一段 here 正在讨论我在寻找什么。

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


【解决方案1】:

我想我一直和你保持着类似的情况。我有一个包含模块的主项目 (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 subtree split is repeatable,而且之前拆分过的每一个revision的SHA都是一样的。

用新的细节更新 ProjA:

cd ProjA
git fetch ProjB_remote
git subtree merge --prefix=modules/projB_mod ProjB_remote/module-for-A --message="commit message"

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

【讨论】:

  • 查看我在问题中添加的评论:您的用例是典型的用例,即您将 ProjA 的子目录分叉到新的 ProjB 中,并希望将更改从 ProjB 拉回到 ProjA 中未来。
  • 我想将第三方 ProjA 的子目录 fork 到我自己的项目中。 ProjA 将继续正常开发子目录(他们永远不会将我添加为子树),但我希望将来能够从中提取错误修正等。
  • 是的,就是子树合并。您可以对本地子树分支 (ProjA) 进行自己的更改,然后在 ProjB 上,您将获取并重新拆分它们的更新。然后进行子树合并,将新的 ProjB 更改放入 ProjA。
  • 如上所述,我不拥有 ProjA,也没有提交权限,他们也不希望合并回我的更改。我正在使用他们的一个子目录并变成一个单独的项目,但希望以一种干净的方式将他们的更改合并到该子目录中。我无权将我的项目作为子树添加到他们的项目中,他们也不会使用子树:他们将像以前一样在原始子目录中继续开发。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2013-09-03
  • 2017-08-13
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多