使用Mercurial递归标记所有子存储库

Dav*_*ton 6 tags mercurial dvcs subrepos mercurial-subrepos

是否可以标记主父存储库并将标记添加到所有子存储库中?

如果没有这个,如果我曾经将项目作为子存储库删除并自行访问它,它将丢失所有标签信息,因为这只属于父存储库.

Joe*_*ant 2

这可能是可能的,但有点棘手。您基本上必须编写自己的tag实用程序(可能作为 Mercurial 扩展)来帮助收集所需的额外信息并对hg tag. 然而,在编写扩展时,我对 API 不太了解,因此我提供的任何想法都将基于hg直接使用命令调用。

默认情况下,当您在主存储库上提交时,首先提交子存储库。然后,它为每个子存储库获取新的变更集 ID,并将它们.hgsubstate以如下格式放入文件中:

77ba00000fe8e9ca033d97dc07b85a50dd106837 nested
Run Code Online (Sandbox Code Playgroud)

递归标记需要获取文件的内容,.hgsubstate因为它位于您在主存储库中标记的变更集中。您可能会想到hg revert,但这将是一个坏主意,因为它很容易弄乱您的工作目录(无论如何hg都不喜欢这样做.hgsubstate)。最好的选择是进行该修订并解析文件hg export中各行的结果差异。+.hgsubstate

然后,您将从每个更改集 id 和子存储库名称中获取更改集 id 和子存储库名称,以便调用hg -R <subrepopath> tag -r <id> <tag>. 当然,最后标记主存储库。

这仍然存在潜在的问题,您必须保持警惕或弄清楚如何忍受这些问题。例如:如果您已提交主存储库但未提交 1 个或多个子存储库,会发生什么情况?现在,您在主存储库上有了多个变更集,其中.hgsubstate在子存储库上列出了相同的变更集 ID。因此,如果您在主存储库上标记这两个标签,则子存储库上的变更集将有 2 个标签。

我正在使用 TortoisHg 2.0.5 和 Mercurial 1.8.4。单独标记子存储库不会产生任何在主存储库上提交的需要,它应该大部分工作正常。