如何使用git blame -S <revs-file>

时间:2015-09-24 16:13:09

标签: git git-rev-list git-blame

$ echo "$dates" | sed -r 's/([^ ]* [^ ]*) /\1, /g' 2015-09-24 12:05:00, 2015-09-24 12:10:00, 2015-09-24 12:15:00, 2015-09-24 12:20:00 的{​​{1}}参数的格式是什么?

我尝试使用revs-file的输出运行它,如下所示,但blame将每一行都归结为git blame -S提交。

git rev-list

我还尝试运行HEAD以反转git blame -S <(git rev-list HEAD~50 HEAD) $file,以防出现问题,但似乎产生相同的输出。

目标是将<(git rev-list ... | tac)的每一行归咎于revs-file$file之间的提交,如果所有提交中都存在相同的行,则默认为HEAD~50。< / p>

1 个答案:

答案 0 :(得分:1)

如果每一行都归因于最新的提交,这意味着事实上每一行都在最近的提交中被触及。

通常当有人改变从单个换行符到CR / LF对的每一行时,会发生这种情况,反之亦然。

啊哈,上面的内容是没有 -S,但-Sgit blame来说意味着插入移植进入提交图。

这是一个特殊功能,旨在与cvsserver一起使用(根据评论),但它不适用于您使用它的方式。

格式只是一系列<commit-ID> <parent-ID> ...\n行。在这种情况下,您希望在git blame处开始HEAD并在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,仅作为一个提交ID,省略父项。这与git rev-list HEAD相同,因为HEAD~50本身可以从HEAD到达。因为这列出了每个提交没有父ID,这使得git blame将每个提交视为根提交。然后以HEAD提交开始,尝试查找其父,将HEAD视为根提交,并且停在那里 - 这使得该提交对每个源代码行都负责。换句话说,通过列出HEAD提交ID,你得到git blame就止了。这就是为什么我们要列出{{{ 1}}。)