Mercurial存储库识别

时间:2011-06-10 13:57:42

标签: mercurial

我需要能够唯一地标识Mercurial存储库,并将该标识符放在克隆时包含的文件中。如果我可以将标识符放在.hg文件夹中的文件中,那么只需将普通文件添加到repo即可。

我知道我可以从提交的第一个更改中获得接近某个标识符。我知道hgrc文件不能用于存储标识符,因为它没有被克隆。

所以,我的问题是:克隆的.hg文件夹中是否有另一个文件可用于放置标识符?感谢。

2 个答案:

答案 0 :(得分:9)

从第一次阅读开始,听起来您希望能够确保存储库的克隆是正确存储库的克隆而不是某些替代冒名顶替者。但是,如果您正在考虑使用的识别信息与其他所有信息一起克隆,那么冒名顶替者仍会通过此测试。您需要将该标识符分开,以便可以将其与克隆中的信息进行比较。

这是否是您的目的,克隆的.hg中的任何文件都可能不想编辑。您必须在.hg之外的仓库的其他区域添加要跟踪的文件。但是,您根本不需要额外的文件,因为更改集哈希不仅仅是接近,而是非常肯定,因此用于轻松识别存储库的信息是内置于存储库的本身。

在命令行上,您可以获得第一个变更集的哈希标识符的短版本或完整版本:

> hg id -i -r0
89abf5502e3c

> hg log -r0 --template "{node}"
89abf5502e3c5c65e532db04d8d87141f0ac8b73

如果我想要比较2个标识符是正确的,以便您或其他人知道存储库的克隆是真正的克隆而不是虚假克隆,那么您可以单独使用相同的changset ID,以便有人可以使用上面的命令之一,以查看他们的克隆的ID,并将其与您应该的内容进行比较。这很像有多少可下载可执行文件的网站在下载链接旁边显示一个哈希标识符,这样您就可以自己散列文件并将结果与​​网站上的哈希值进行比较。

编辑 关于您的评论,以阐明此的目的:

由于您需要能够从文件中读取它,因此有几个选项:

存储库根目录中的跟踪文件

您可以考虑使用一个文件,而不是创建自己的文件:.hgtags

hg tag -r0 ident

...会标记第一个修订版,允许您使用ident作为对该变更集的引用,而不是-r0。 Mercurial始终使用最新版.hgtags的标记信息,无论工作目录更新到什么变更集,但这对您的应用程序可能无关紧要。 hg tag将这样的行附加到.hgtags文件,如果该文件不存在则创建该文件:

a247494248c4b96a571bbd12e90eade3bf559281 ident

如果你的repos中还没有标签文件,这是最方便的,因为它将是文件中的第一行,便于查找。你可能认为自己可以简单地编写这个文件,但是你仍然需要调用hg来获取变更集ID,并在某个时候再次将其添加到跟踪然后提交:hg tag完成所有操作适合你。

如果已经有可能考虑使用标签文件,那也没关系,因为它们往往相对较短,您只需要查找以您选择的标签名称结尾的1行。 Mercurial专为.hgtags的仅附加操作而设计,但如果您将此标记的行插入.hgtags已存在的第一行,则所有内容仍然可以正常工作,因为:1。标记永远不会被移动或移除。 2.您将使用文件中尚未使用的标记名称。

阅读hg的胆量

有些文件通常只有Mercurial本身在.hg中更深入,可以读取以获取第一个变更集的哈希值。我查看了Mercurial的File FormatsRevlogRevlogNG,至少在我自己的存储库中有两个,.hg\store\00changelog.i包含偏移量为0x20(长度为20个字节)的第一个变更集的散列值)。可能,至少从Mercurial 0.9开始,它在所有回购中都是一样的。 RevlogNG还指出该文件的前4个字节将指示Revlog版本号和标志。虽然变更集ID当前只有20个字节长,但它的实际字段长度为32个字节,可能用于将来扩展到更长的散列。

由于此选项不需要更改现有存储库,并且只涉及读取主索引的前52-64个字节,因此它是我可能会使用的那个。如果我在产品的早期阶段捕获这个要求之前它管理的任何回购都是野外的,我会倾向于自定义文件方法,因为我可能会创建自己的元数据文件并从repo的开头添加

答案 1 :(得分:0)

error: repository is unrelated消息来自mercurial/treediscovery.py

base = list(base)
if base == [nullid]:
    if force:
        repo.ui.warn(_("warning: repository is unrelated\n"))
    else:
        raise util.Abort(_("repository is unrelated"))

base变量存储两个存储库的最后公共部分。通过提出推/拉检查的想法,我们可以假设存储库是相关的,如果它们有共同的根,那么检查命令的哈希值:

$ hg log -r "roots(all())"

对于我不知道的原因hg log -r 0始终显示相同的根,但您可能会遇到 FIRST_REPO 持有 SECOND_REPO 历史记录的情况,但很明显0 SECOND_REPO 的转速与 FIRST_REPO 不同,但Mercurial检查已通过。

您可能不会通过精心设计存储库来欺骗根检查,因为构建两个存储库看起来像这些(具有公共部分但不同的根):

0 <--- SHA-256-XXX <--- SHA-256-YYY <--- SHA-256-ZZZ
0 <--- SHA-256-YYY <--- SHA-256-ZZZ

不可能,因为这意味着您反转SHA-256,因为每个后续哈希都依赖于之前的值。