代码之家  ›  专栏  ›  技术社区  ›  Kimble

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

  •  7
  • Kimble  · 技术社区  · 15 年前

    我为我的web应用程序创建了一个构建系统,它重写了所有资源url,以包含文件的修订号(以改进客户端缓存)。从今天起,我将对每个文件运行以下命令以获取修订号:

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

    真正地 耗时。有没有一种快速的方法列出存储库中所有文件的最新版本号?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Ry4an Brase    15 年前

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

    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
  •   Luke Luo    12 年前

    有一个hg debug命令“hg debugdata-m REV”,可能会对您有所帮助。其工作原理如下:

    1. 我在变更集0/1/2/中分别提交了3个文件a.txt/b.txt/c.txt。我在rev 3中修改了a.txt。DAG如下所示:

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

      hg对数-q

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

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

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

    此命令列出版本REV的“清单”。清单是所有file@version存在于特定变更集版本中。让我们看看第3版的清单是什么:

    a、 txt^@a9ecbd92f8182efd8eeb5396468fd70884650395 b、 txt^@1e88685f5ddec574a34c70af492f95b6debc8741

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

    现在您在修订版3中有了文本名和它们的nodeid。只需一个调试命令就可以生成所需的全部内容。我认为这是一个更好的解决办法。

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

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

    hg帮助调试数据

    hg帮助调试索引


        3
  •  2
  •   Vadim Kotov First Zero    8 年前

    discussion mercurial邮件列表似乎提供了一个合理的解决方案,尽管我没有尝试过。