我正在寻找一种使Mercurial输出如下表的方法:
File Most recent revision changing the file Date of that revision
==== ====================================== =====================
foo.py 44159adb0312 2018-09-16 12:24
... ... ...
这就像github在“代码”概述页面上所做的一样。 (来自torvalds / linux的屏幕截图):
“最近”可能是指日期或相对于当前变更集的DAG层次结构,或者可能是相对于当前分支的日期。也许后者更有用,但是在我的特定用例中,它没有什么作用。
我还希望能够提供我想要该表的文件列表或子目录。 (我并不一定想要所有内容)
我知道我可以使用一个小的脚本来遍历hg log -l 1 <file>
,但是我想知道是否有更有效/更自然的解决方案。
答案 0 :(得分:0)
更有效/更自然的解决方案可以是:
?mapply
或hg log -l 1 --template ...
创建别名答案 1 :(得分:0)
Git将遵循提交DAG,因为仅此而已。在Mercurial中,您有(许多)更多选择,因为您有更多数据。
这里的理想选择可能是follow(file, .)
(适当时结合first
或last
)。但正如hg help revset
会告诉您的那样,您有以下选择(我将列表缩小为明显的适用范围):
ancestors(set[, depth])
例如,如果要在la Git之后执行DAG,则将set
与.
一起使用以获取当前提交的祖先。或者,使用::.
,基本上相同。
branch(string or set)
将此值与.
一起使用可获取当前分支中的所有提交。如果您不在当前分支的顶部,请与其他限制器(例如parents
)结合使用,以避免查看当前分支中的后续提交。
file(pattern)
将其与全局模式一起使用,以查找影响给定文件的变更集。
filelog(pattern)
与file
类似,但速度更快,但为了提高速度而牺牲了一些准确性(有关详细信息,请参阅文档)。
follow([file[, startrev]])
引用文档:
"::."
(工作目录的第一个父项的祖先)的别名。 如果指定了文件模式,则匹配给定文件的历史记录 遵循startrev给出的修订中的模式,包括 副本。
modifies(pattern)
使用此命令(具有任何模式,而不仅仅是glob)来查找修改某些文件或目录的变更集。我认为这仅限于M
类型的修改,而不是添加或删除文件,因为还有adds(pattern)
和removes(pattern)
。一起使用or
的这三个版本,以查找所有添加/修改/删除操作。
first(set, [n])
last(set, [n])
limit(set[, n[, offset]])
使用它从修订集中提取特定条目。
向前搜索时(默认),last(follow(file, .))
可以很好地找到正确的修订版。如您所述,您必须对每个文件执行一次操作-如果您编写自己的Mercurial插件来执行此操作,而又不一直重新加载系统的其余部分,无疑会更快。
答案 2 :(得分:0)
您将无法遍历所有文件。但是使用hg manifest
,您可以获得该文件列表。然后根据需要对输出进行模板化:
for f in $(hg ma); do hg log -l1 $f -T"$f\t\t{rev}:{node|short}\t\t{date|isodate}"; done
这给出了类似的输出
.hgignore 38289:f9c426385853 2018-06-09 13:34 +0900
.hgsigs 38289:f9c426385853 2018-06-09 13:34 +0900
.hgtags 38289:f9c426385853 2018-06-09 13:34 +0900
您可能想进一步讨论输出格式。有关输出模板的完整概述,请参见mercurial wiki。