【发布时间】:2019-09-21 17:37:55
【问题描述】:
我想做一些比un-submodule a git submodule复杂一点的事情
我有一个包含子模块 repos 的顶级 git repo。
我想在顶级 repo 上执行过滤器分支历史记录重写,并且基本上在顶级历史记录中的每次提交时合并来自相应子模块版本的文件。
这也可以描述为Convert a git folder to a submodule retrospectively?的反面
例如,
子模块仓库有历史
A--B--C--D
顶级回购有历史
X--Y--Z
where
X[points to A]--Y[points to B]--Z[points to D]
另一个问题中描述的幼稚解决方案将导致:
A--B--C--D
\
> M
/
X--Y--Z
我想要:
X'--Y'--Z'
where:
X' is X plus the files from A
Y' is Y plus the files from B
Z' is Z plus the files from D'
解决用户 torek 的评论:请注意,提交 C 丢失,提交 D' 包含提交 C 和 D 的所有更改。这不是选择,而是简化。我也会很高兴提交 C'(来自 C 的更改)只是出现在 Y' 和 Z' 之间,不幸的是这会引入其他不值得解决的边缘情况。
到目前为止我尝试了什么?
花了一些时间试图阐明我想要做什么并研究现有的 SO 问题。
这是 XY 问题吗?
不,不是。这不是我真正要解决的更大问题的一部分。
【问题讨论】:
-
值得注意的是:如果超级项目有 3 个唯一的 gitlinks 到子模块,但子模块本身有超过 3 个提交,你几乎肯定会在重写中省略除三个子模块提交之外的所有提交,去子模块化的超级项目。如果您希望避免遇到更困难的问题,因为无法保证超级项目提交图和子模块提交图是一致的。
-
是的,很好。我更新了问题以显示来自子模块 repo 的丢失提交。
标签: git