git blame -S
的revs-file
参数的格式是什么?
我已经尝试运行它与git rev-list
的输出如下,但归咎于HEAD
提交的每一行。
git blame -S <(git rev-list HEAD~50 HEAD) $file
我也试过运行<(git rev-list ... | tac)
来逆转revs-file
,以防这是问题,但它似乎产生相同的输出。
目标是将$file
的每一行都归咎于HEAD~50
和HEAD
之间的提交,如果在所有提交中都出现同一行,则默认为HEAD~50
。
如果每一行都属于最近的提交,这意味着每一行实际上都在最近的提交中被修改过。
通常这种情况发生在某人将每一行从单个换行符更改为CR/LF对,或反之亦然时。
啊哈,如果没有 这是一个特殊的功能,旨在与cvsserver一起工作(根据注释),但它不适合您使用它的方式。 格式只是一系列 (您用于提供-S
,上述的是正确的,但是-S
的意思是,对于git blame
来说,插入嫁接到提交图中<commit-ID> <parent-ID> ...n
行。因为,在本例中,您希望在HEAD
处启动git blame
,并在HEAD~50
处停止它,我们可以这样做:git rev-parse HEAD~50 | git blame -S /dev/stdin $file
git rev-parse
输出提交HEAD~50
的SHA-1,没有额外的行,这使得提交没有父提交,这使得git blame
在该点停止历史遍历。-S
输入的命令git rev-list HEAD~50 HEAD
列出了HEAD~50
或HEAD
中可访问的每个git rev-list HEAD
相同,因为HEAD~50
本身可以从HEAD
访问。因为它列出了没有父id的每个提交,这使得git blame
将每个提交视为根提交。然后,它从HEAD
提交开始,试图找到它的父提交,将HEAD
视为根提交,并在那里停止—这使得该提交负责每个源代码行。换句话说,通过列出HEAD
提交ID,您可以让git blame
止步于此。这就是为什么我们要列出HEAD~50
。)