这可能不是您正在寻找的答案,但我们最近有 Mercurial 新手用户使用子存储库的经验,我一直在寻找机会传递我们的经验......
总结来说,根据经验我的建议是:无论 Mercurial 子存储库多么吸引人,都不要使用它们。相反,找到一种方法来并排放置目录,并调整构建来应对这种情况。
无论将子存储库中的修订与父存储库中的修订结合在一起似乎很有吸引力,但它在实践中行不通。
在转换的所有准备过程中,我们收到了来自多个不同来源的建议,认为子存储库很脆弱并且实施得不好 - 但我们还是继续前进,因为我们希望在存储库和子存储库之间进行原子提交。这些建议——或者我对它的理解——更多地谈论了原则而不是实际后果。
直到我们使用 Mercurial 和子存储库后,我才真正正确地理解了这些建议。这里(凭记忆)是我们遇到的各种问题的示例。
- 您的用户最终将与更新和合并过程作斗争。
- 有些人会更新父仓库而不是子仓库
- 有些人会从子存储库推送,ang .hgsubstate 将不会更新。
- 您最终将“丢失”在子存储库中所做的修订,因为有人会在合并后设法使 .hgsubstate 处于错误状态。
- 有些用户会遇到 .hgsubstate 已更新但子存储库尚未更新的情况,然后您会收到非常神秘的错误消息,并且会花费很多时间尝试弄清楚发生了什么。
- 如果您对版本进行标记和分支,则如何为父存储库和子存储库做好此操作的说明将长达数十行。 (我什至有一位友善、温顺的 Mercurial 专家帮助我编写说明!)
所有这些事情对于专家用户来说已经够烦人的了——但是当你向新手用户推出 Mercurial 时,它们就是一场真正的噩梦,并且是浪费大量时间的根源。
因此,在投入大量时间来进行子存储库转换后,几周后我们将子存储库转换为存储库。因为我们在通过 .hgsubstate 引用子存储库的转换中有大量历史记录,所以它给我们留下了更复杂的东西。
我只希望我能早点真正理解所有建议的实际后果,例如在 Mercurial 的最后的手段的特点 page:
但我需要管理子项目!
再说一次,不要那么确定。像 Mozilla 这样具有大量依赖项的重要项目在不使用子存储库的情况下也能正常工作。大多数小型项目在不使用子存储库的情况下几乎肯定会更好。
编辑:思考shell 仓库
有了免责声明,我对他们没有任何经验......
不,我不认为他们中有很多人是这样的。您仍在使用子存储库,因此所有相同的用户问题都适用(当然,除非您可以为每个步骤提供包装器脚本,以消除人类提供处理子存储库的正确选项的需要。)
另请注意,您引用的 wiki 页面确实列出了 shell 存储库的一些具体问题:
- 过于严格地跟踪project/和somelib/之间的关系
- 无法检查或推送项目/如果某些lib/源代码库变成
- 不可用 缺乏对递归 diff、log 和 的明确支持
- 提交的状态递归性质令人惊讶
编辑 2 - 进行试用,让所有用户参与
当多个用户开始提交、拉取和推送时,我们才真正开始意识到我们遇到了问题——包括对子存储库的更改。对我们来说,现在回应这些问题已经太晚了。如果我们早点认识他们,我们的反应就会更容易、更简单。
所以在这一点上,我认为我能提供的最好建议就是推荐你在布局刻板之前对项目布局进行试运行.
我们等到全面试验时已经太晚了,无法进行更改,即使这样,人们也只在父存储库中进行更改,而不是子存储库 - 所以我们仍然没有看到全貌,直到为时已晚。
换句话说,无论您考虑什么布局,都可以在该布局中创建一个存储库结构,并让很多人进行编辑。尝试将足够的真实代码放入各种存储库/子存储库中,以便人们可以进行真正的编辑,即使它们将是一次性的。
可能的结果:
- 您可能会发现一切正常 - 在这种情况下,您将花费一些时间来获得确定性。
- 另一方面,您可能会比花时间尝试找出结果更快地发现问题
- 您的用户也会学到很多东西。