0

我目前正在从 CVSNT 迁移到 Mercurial,但遇到了我过去使用 CVS 模块能够实现的问题。我有两个项目 A 和 B,它们都依赖于目录 C 中的公共代码。如果我对目录 C 中的代码进行更改,我希望这些更改同时反映在项目 A 和 B 中。(这似乎是这里的问题完全相反)

我认为这可以使用 subrepos 来实现,但是项目 A 和 B 中的 .hgsubstate 会记录我列出的提交的子 repo 中的变更集。即我在项目 A 上提交了 C 的更改,我必须手动打开 B 来更新和提交。(实际上,还有更多的项目只有 A 和 B,是的,我知道公共代码应该在共享库中,但 PHB 坚持!)

有没有办法做到这一点?理想情况下,我希望它对用户来说是透明的 repos 的结构,即他们可以提交对 C 的更改,而不必意识到它是他们项目的子 repo。(目前 tortoise Hg 使用“S”表示子存储库是脏的)。我想我需要的是爸爸回购和部分退房,但肯定有更好的方法吗?我在 Windows 上,所以符号链接不可用。

4

1 回答 1

0

您必须手动更新(并提交)子存储库的事实是非常有意的。在 CVS 和 SVN 中发现的这个错误特性被故意忽略了。

如果它会自动将子存储库更新为最新提交,则无法保证代码将继续工作。例如,如果您要更改 C 的 API,则 A 和 B 在您相应地更改它们之前都不会起作用。而且由于您永远不能同时以原子方式推送多个存储库,因此不可避免地会出现一个窗口,在此期间 A 和 B 不起作用。在实践中,这个窗口可能会变得相当大,尤其是当其中一个依赖项目受到较少的开发关注时。如果项目 B 被搁置一段时间,项目 A 对 C 的更改将立即破坏它。

更糟糕的是,更新到早期版本将无法将子存储库恢复到当时的状态。因此,一旦您对子存储库进行向后不兼容的更改,旧版本将不再工作!这大大降低了版本控制的有用性。它会导致分支问题,例如二等分将无法工作。

这就是为什么您需要手动更新到最新版本的 C,测试一切是否仍然有效,并签入该子存储库更新的原因。从而将存储库版本紧密锁定到子存储库版本。你牺牲了一点便利,但你获得了代码稳定性,我希望我能够弄清楚为什么这会更好:)。

至于从父存储库中透明地提交到子存储库,据我所知,它计划这样做,但到目前为止还没有人真正实现它。

于 2012-08-01T16:43:30.043 回答