如何获取Mercurial存储库中每个文件的最新版本号列表?

时间:2010-04-06 12:49:33

标签: mercurial

我为我的Web应用程序创建了一个构建系统,它正在重写所有资源URL以包含文件的修订号(以改进客户端缓存)。截至今天,我正在为每个文件运行此命令以获取修订号:

hg log --template '{rev}\n' path-to-file

为每个文件执行hg 真的耗时。有没有一种快速的方法来列出具有最新版本号的存储库中的所有文件?

3 个答案:

答案 0 :(得分:2)

通过解析hg annotate或作为mercurial扩展,在python中编写这样的命令应该不会太困难。 mercurial邮件列表中的以下discussion似乎提供了一个合理的解决方案,尽管我还没有尝试过。

答案 1 :(得分:2)

这样做会,但请参阅上面的评论,为什么在工作流程中的任何地方使用它可能是一个坏主意。在列表中,您应该使用修订哈希而不是数字,因为克隆时不会更改。这也不是非常有效,但至少它只有两个进程实例化而不是每个文件一个:

hg grep --all '.' | perl -na -F: -e 'next unless ($F[2] eq "+"); print "$F[0] $F[1]\n" unless ($prev eq $F[0]); $prev = $F[0]'

示例:

that 3
file 1

答案 2 :(得分:2)

有一个hg debug命令“hg debugdata -m REV”可能对你有所帮助。以下是它的工作原理:

  1. 我分别在变更集0/1/2 /中提交了3个文件a.txt / b.txt / c.txt。我在rev 3中修改了a.txt.DAG看起来像这样:
  2. ------- 0 -------> 1 --------> 2 -------> 3

    a.txt b.txt c.txt a.txt

     So the newest rev for a/b/c should be 3/1/2;
    
    1. 之后,日志记录为:

      hg log -q

         3:31308f74291a
         2:8d438b01dfd4
         1:fcc0f041df56
         0:c53934933136
      
    2. a.txt有两个版本,分别链接到变更集0和3。对于a.txt的每个版本,mercurial将为其生成唯一的哈希(nodeid)。这些nodeid仅与a.txt有关,与changeset hash不同。我们可以使用另一个debug命令来查看这些版本是什么:

      〜/ work / hg / a / .hg / store / data $ hg debugindex a.txt.i

    3. rev     offset   length  base  linkrev   nodeid               p1            p2
      
       0         0       3      0     0        b789fdd96dc2    000000000000  000000000000
       1         3       6      1     3        a9ecbd92f818    b789fdd96dc2  000000000000
      

      我们可以看到这两个“nodeid”(b789fdd96dc2 / a9ecbd92f818)分别对应变更集版本(linkrev)0/3。由于这些nodeid基于文件内容和父信息(p1 / p2)进行散列,因此它们在存储库意义上是“唯一的”。所以“b789fdd96dc2”标识a.txt@version-0,a9ecbd92f818标识a.txt@version-3。

      1. 最后,让我们看看“hg debugdata -m REV”是如何工作的。
      2. 此命令列出版本REV的“清单”。清单是特定变更集REV中存在的所有文件@版本的目录快照。让我们看看版本3中的清单:

          

        〜/ work / hg / a $ hg debugdata -m 3

             

        a.txt^@a9ecbd92f8182efd8eeb5396468fd70884650395   b.txt^@1e88685f5ddec574a34c70af492f95b6debc8741   c.txt^@149da44f2a4e14f488b7bd4157945a9837408c00

        对于a.txt,您可以看到它的nodeid是“a9ecbd92f8182efd8eeb5396468fd70884650395”,它与步骤3中提到的短版本nodeid匹配。这样的nodeid应该很好地为您的“重写URL”提供服务。

        现在您在修订版3中有文本名称及其nodeid。它只需要一个调试命令即可生成您想要的所有内容。我认为这是一个更好的解决方案。

        如果您对mercurial提供的调试命令感兴趣,请执行以下操作:

        hg debugcomplete debug (列出所有调试命令)

        hg help debugdata

        hg help debugindex