【问题标题】:Get last commit for every file of a file list in Mercurial获取 Mercurial 中文件列表中每个文件的最后一次提交
【发布时间】:2019-09-23 19:15:23
【问题描述】:

我有一个 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 个日期,然后更改该日期的文件列表,或类似的)

【问题讨论】:

    标签: find mercurial


    【解决方案1】:
    1. 即使使用 find+exec,您也可以使用修改后的模板 {date|shortdate}\n 获得更短的(由最后一个 exec 执行)链
    2. 您可以使用(已接受)来自this question 的 perl-ism 或要求任何人将提到的 lof 扩展更新到当前 Mercurial(code from 2012 现在无法使用)

    替代方案(肮脏丑陋的黑客)

    在任何情况下,您都可以|只需要调用一次 hg 并对结果进行一些后处理。

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

    之后,您可以:

    • 像这样执行 hg 日志

      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 需要的文件,按列 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
    

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

    【讨论】:

    • hg grep "." -l "set:sources/php/dracca/endpoint/wiki/**/Wiki*.php" -l -d -q 似乎有效,但我不明白为什么要两次-l?尽管如此,我实际上已经回退了文件的创建/修改日期(因为它更适合实际的业务需求),但这很有趣(我不知道模板中的 %)谢谢!
    • @Xenos,这里的字体很糟糕。真的是 I+ L 小写(在答案中替换为长选项)
    • 也许 grep 的模板会很有用 -T"{files}\t{date|shortdate}\n"
    • 哦,确实,我很笨,感谢Il 的大纲。 hg grep -ldq "<" "set:sources/php/dracca/endpoint/wiki/**/Wiki*.php" 返回我所期望的(“
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多