我不使用 Mercurial,但我想开始,所以我正在阅读它。我广泛使用的唯一 SCM 系统是 CVS。我读过的关于 Mercurial 的大部分内容都是有道理的,而且听起来不错。但我对它做标签的方式时而感到震惊和困惑。
标记只是变更集的昵称(“变更集”实际上是指变更集产生的状态)。凉爽的。从标签到变更集 ID 的映射存储在.hgtags
文件中。也很酷。该.hgtags
文件是版本化的。
什么?
这有很多违反直觉的后果。例如,如果我提交了一个我想要标记的变更集(例如,将形成版本 1.0 的代码),我必须在标记后再次提交,以将更新的标记文件放入存储库。如果我稍后更新到该标记的变更集,则工作副本将不包含该标记的任何知识。如果我做了一些工作,从而建立了一个新分支(例如,对于错误修复,朝着 1.1 前进),那么该分支将不知道它所生长的标签。除非我手动复制它,否则就是这样。
随着原始主干和我的新分支上的开发继续进行,并创建标记以标记重要的变更集(主干上的 2.0 版本,分支上的 1.1 和 1.2 错误修复版本),两个分支将在不知道另一个的情况下继续进行分支的标签。所以,如果我完成了一个分支的工作,并且想要切换到另一个分支上的某个特定变更集(例如,我完成了 1.2 错误修复版本,但现在必须从基于 2.0 的 2.1 错误修复开始),我现在被填满了。我当前的变更集不知道 2.0!
我能做些什么?
- 我可以请在 2.x 分支上工作的人读出 2.0 的实际变更集 ID,并明确使用它,但这令人震惊。
- 我可以命名我的分支,也可以使用标签,这样我就可以跳到 2.x 分支的头部,从而了解新标签,然后跳回 2.0 标签。假设分支与标签不同,是普遍可见的——是这样吗?即使是这样,这似乎也很笨拙。
- 我可以在存储库之外维护一个全局
hgtags
文件,并使用几个钩子在更新时拉入副本,覆盖本地副本,并在提交时复制回任何更改。我不确定这在多用户环境中如何工作,开发人员正在将更改推送到共享存储库;我可能需要一个单独的存储库来存放hgtags
文件。 - 我可以使用本地标签,它位于版本控制机制之外,从而避免了整个问题。与共享全局标签一样,我必须建立一种机制来
localtags
在开发人员之间同步文件。
这些解决方案似乎都不是很好。我应该怎么办?
这里的一个假设是我正在使用单个存储库中的命名分支来管理分支,而不是每个分支的存储库。如果我做后者,情况会更好吗?