获取 Mercurial 文件列表中每个文件的最后一次提交

Get last commit for every file of a file list in Mercurial

我有一个 hg 存储库,我想知道 sources/php/dracca/endpoint/wiki/**/Wiki*.php

中每个文件的最后提交日期

到目前为止,我有这一张:

find sources/php/dracca/endpoint/wiki/ -name "Wiki*.php" -exec hg log --limit 1 --template "{date|shortdate}" {} \; -exec echo {} \;

但这似乎非常慢,因为(我想)find 每个文件调用 1 hg,导致我在那里的(比如说)~40 个文件需要 15 秒的计算。 .

有没有更快的方法?

此命令的输出如下所示:

2019-09-20 sources/php/dracca/endpoint/wiki/characters/colmarr/WikiCharactersColmarrEndpoint.php
2019-09-20 sources/php/dracca/endpoint/wiki/characters/dracquints/allgroup/WikiCharactersDracquintsAllgroupEndpoint.php
...

如果需要,它可能会稍微更改(我不介意有 1 个日期,然后文件列表针对该日期更改,或类似这样的内容)

  1. 即使使用 find+exec,您也可以使用修改后的模板获得更短的(最后一个 exec)链 {date|shortdate}\n
  2. 您可以使用(已接受的)来自 this question or ask anybody to update mentioned lof extension to current Mercurial (code from 2012 的 perl-ism 现在不起作用)

备选方案(肮脏丑陋的技巧)

在任何情况下,您都可以|只调用一次 hg 并执行一些 post-结果处理。

在这些技巧之前,阅读 hg help filesets 并为您的文件获取一个通用文件集(我想,它 可以 只是 set:sources/php/dracca/endpoint/wiki/**/Wiki*.php 但 TBT!)

之后,您可以:

  • 像这样执行 hg log

    hg 日志设置。* --template "{files % '{file} {rev} {date|shortdate}\n'}"

(我用的是简单的模式来测试,你必须有自己的文件集)

以这种形式得到输出

setup.py 1163 2018-11-07
README.md 1162 2018-11-07
setup.py 1162 2018-11-07
hggit/git_handler.py 1124 2018-05-01
setup.py 1124 2018-05-01
setup.cfg 1118 2017-11-27
setup.py 1117 2017-11-27
hggit/git2hg.py 1111 2017-11-27
hggit/overlay.py 1111 2017-11-27
setup.py 1111 2017-11-27
…

(有一些不需要的意外文件,因为我在修订中删除了所有文件,这影响了感兴趣的文件,没有过滤器)。您只需要 grep 需要的文件,按 cols 1+2 排序并使用每个文件的最新修订日期

  • 使用hg grep。对于上面的测试模式

    hg grep "." -I setup.* --files-with-matches -d -q

(查找任何更改,仅输出文件名+修订版,短日期)

你会得到类似

的东西
setup.py:1163:2018-11-07
setup.cfg:1118:2017-11-27

并且第 3 列将是您需要的文件的最后修改日期