Mercurial存储库识别

Ran*_*dyR 5 mercurial

我需要能够唯一地标识Mercurial存储库,并将该标识符放在克隆时包含的文件中.如果我可以将标识符放在.hg文件夹中的文件中,这比简单地将正常文件添加到repo更好.

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

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

Joe*_*ant 9

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

无论这是否是您的目的,.hg克隆的任何文件都可能不想编辑.您必须在回购的其他区域添加要跟踪的文件.hg.但是,你并不需要一个额外的文件,同时,作为变更哈希不只是接近确定,但很肯定的,所以轻易识别库中的信息是内置到存储库本身.

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

> hg id -i -r0
89abf5502e3c

> hg log -r0 --template "{node}"
89abf5502e3c5c65e532db04d8d87141f0ac8b73
Run Code Online (Sandbox Code Playgroud)

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

编辑 您的评论,阐明其目的:

由于您需要能够从文件中读取它,因此有以下几种选择:

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

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

hg tag -r0 ident
Run Code Online (Sandbox Code Playgroud)

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

a247494248c4b96a571bbd12e90eade3bf559281 ident
Run Code Online (Sandbox Code Playgroud)

如果你的repos中还没有标签文件,这是最方便的,因为它将是文件中的第一行,便于查找.您可能认为可以自己编写此文件,但是您仍然需要调用hg以获取更改集ID,并在某些时候将其添加到跟踪然后提交:hg tag为您完成所有这些.

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

读书hg的胆子

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

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