我目前正在从CVSNT迁移到Mercurial,但我遇到了以前用CVS模块实现的问题。我有两个项目说A和B都依赖于目录C中的公共代码。如果我对目录C中的代码进行了更改,我希望更改能够反映在项目A和B中。(它似乎是完全相反的问题here)
我认为这可以使用subrepos实现,但项目A和B中的.hgsubstate会记录我列出的子仓库中的变更集。即我在项目A上提交了C更改,我必须手动打开B来更新和提交。 (实际上还有更多项目只有A和B,是的,我知道公共代码应该在共享库中,但PHB坚持!)
有没有办法实现这个目标?理想情况下,我希望它对用户透明如何构建回购,即他们可以对C进行更改,而不必意识到它是他们项目的子回购。 (目前,龟龟使用'S'来表示subrepo是脏的)。我想我需要的是爸爸回购和部分退房,但肯定有一个更好的方法吗?我在Windows上,因此符号链接已经完成。
答案 0 :(得分:0)
您必须手动更新(并提交)子存储库这一事实非常有意义。在CVS和SVN中发现的这种错误被故意遗漏。
如果它会自动将子存储库更新为最新提交,则无法保证代码仍然有效。例如。如果您要更改C的API,A和B都不会起作用,直到您相应地更改它们。而且因为你永远不能同时原子地推送多个存储库,所以不可避免地会出现A和B无法工作的窗口。在实践中,这个窗口可能会变得相当大,特别是一旦这些依赖项目中的一个受到较少的开发关注。如果项目B暂停一段时间,项目A对C的更改将在任何时候打破它。
更糟糕的是,更新到早期版本将无法将子存储库恢复到当时所处的状态。因此,只要您对子存储库进行向后不兼容的更改,旧版本将不再起作用!这大大降低了版本控制的实用性。它会引起分支问题,例如二等分将无法工作。
这就是为什么您需要手动更新到最新版本的C,测试一切是否仍然有效,并检查该子库更新。从而将存储库版本紧密锁定到子存储库版本。你牺牲了一些方便,但你获得了代码稳定性,我希望我能够弄清楚为什么这会好得多:)。
至于从父存储库中透明地提交到子存储库,据我所知计划这样做但是到目前为止还没有人实际实现它。