我要为这个问题添加一个非常晚的准答案,因为它是很多很多使用 Mercurial 的人,包括我在内,都会问的问题——在使用其他工具之后,我们想要拥有并期望拥有的东西,比如svn 属性。
据我所知,Mercurial 没有这样的扩展。然而。
是的,Mercurial 的方式似乎是跟踪文件并且只跟踪文件。可能他们纠正这种扩展的方法是将必要的元数据放入 ...repo/.hg* 文件中。
好的。我一直在玩这个。在尝试编写工具之前,先手工做一些事情。
版本化 .hg 文件方法的主要弱点是,如果您检查非提示版本,例如“hg update -r OLD-VERSION”,您将获得元数据的旧版本。
因此,我认为关键可能是将元数据放入 ...repo/.hg* 文件中。
但是......大多数操作应该使用或基于此类文件的最新版本执行。即,我认为此类元数据文件“超越”了版本——即它们希望被版本化,但在理想情况下,您可能会将它们想象为覆盖在您可能已经签出旧版本的正常版本化文件上。
此外,在许多情况下,您希望单独处理此类元数据文件的分支。例如,想象一个文件,您试图在其中一起编写所有分支的描述。也许比较分支,例如“branch1.1 是 branch1 的更新版本”。您不希望该描述出现在任一分支上;或者,更确切地说,您希望它同时出现在两个分支上,并且您希望更改反映在两个分支上。
这种假定的扩展将在“hg cat -r tip ...repo/.hg-my-new-metadata”上运行。或者它会以某种方式覆盖文件的版本与超越元数据文件的正常版本。
我在使用 subrepos 方面取得了一些进展:
superrepo
files // normally-versioned-files <-- a subrepo
metadata // version transcending metadata <-- a subrepo
这使我可以查看最新的元数据以及旧版本的文件
它并不完全存在,因为检查超级存储库的特定版本可能会得到元数据子存储库的旧版本。但至少较新的版本在 subrepo 中。
还要注意的是,无论您将元数据放在相邻的子存储库中,还是将其保存在同一个存储库中(但在提示上操作),都有一个问题,您可以做
hg clone -r OLD-REVISION repo newrepo
这将在 OLD-REVISION 之后删除元数据。包括表示“OLD-REVISION 通过了所有测试”的元数据,即它将从可能适用于 OLD-REVISION 的后续版本中删除元数据。
hg 标签也会出现同样的问题。
有人可能会说“好吧,永远不要那样做”——永远不要剥离历史。不幸的是,这通常被推荐为“整理”存储库的一种方式。
Mercurial 似乎很难避免这种情况。