给定一系列提交,比如说HEAD~1
和HEAD
(即,只是HEAD
),我想找到在该范围内更改的行的先前作者以及他们更改了多少行。
更准确地说:对于范围内更改的每一行,我想获取前一位作者(git blame
例如,使用 )。然后我想由这些作者分组总结更改的行。
例如,考虑之前被这些人更改过的文件X HEAD
(我在行首标记了更改行的人,相当于git blame
的输出):
Adam: Lorem ipsum dolor
Adam: sit amet, consectetur
Adam: adipiscing elit.
Bob: Praesent efficitur urna
Bob: ac volutpat lacinia.
Bob: Sed sagittis, metus non
Adam: maximus tristique, leo
Adam: augue venenatis enim,
Adam: ac rutrum nulla odio
Adam: id urna.
现在,笔者Carl
改变如下文件(注意,这是一个伪混合git blame
和git diff
):
Adam: Lorem ipsum dolor
Adam: sit amet, consectetur
- Adam: adipiscing elit.
+ Carl: adipiscing elit I love cats.
- Bob: Praesent efficitur urna
+ Carl: Praesent efficitur urna :D
- Bob: ac volutpat lacinia.
+ Carl: ac volutpat lacinia YOLO.
+ Carl: Added extra line, lol!
- Bob: Sed sagittis, metus non
Adam: maximus tristique, leo
Adam: augue venenatis enim,
Adam: ac rutrum nulla odio
Adam: id urna.
所以卡尔改变了鲍勃的 2 行,删除鲍勃的 1 行,并更改了亚当的 1 行。因此,我的脚本的输出应该是:
鲍勃:3 亚当:1
我的整体解决方案是:
-L
参数传递git blame
到以查询以前的作者git blame
输出并总结自己做最后的分组。我目前正在努力解决 1.: 获取由差异更改的行范围(在这种情况下,范围为 3,6)。一旦我有了这些范围,我就可以将它们传递git blame -L
给这些行的以前的作者。那么我如何制作git diff
或其他 git 工具将行范围作为数字start,end
对返回?
我不知道有什么方法可以告诉 Git 执行此操作,但是我编写了一个解决方案来解析 的输出git diff
以获得您需要的值。
如果运行git diff -U0
,在每个块的顶部,您将看到如下内容:
@@ -5,2 +5,3 @@
这意味着从第 5 行开始删除了 2 行,并在那里添加了 3 行。(-U0
用于git diff
隐藏所有上下文行的参数,以便仅打印实际更改的行。没有该参数,行号将不正确。)对于给定的块,可能会发生三种不同的情况:添加行,添加行删除,或修改行(删除和添加)。前面的示例显示了标题将显示修改后的行的内容。添加的行如下所示:
@@ -5,0 +6,2 @@
对于您的用例,我们可以忽略这些行。删除的行看起来像这样:
@@ -5,5 +4,0 @@
请注意,每对中的第二个数字是一个偏移量,显示添加/删除了多少行。值得庆幸的是,git blame
还可以接受该<end>
值的偏移量,因此我们可以将其转换为git blame
可以接受的格式。
这是一个bash one-liner 应该可以解决问题:
git diff -U0 HEAD~1 -- $file | grep "^@@" | grep -Ev "@@ -[[:digit:]]+,0" | sed 's/^@@ //' | sed 's/ @@.*//' | cut -d' ' -f 1 | sed 's/[+-]//' | awk '{ if ($1 !~ /,/) { print $1",1" } else { print $1 } }' | sed 's/,/,+/'
解释:
$file
是您正在处理的当前文件。
第一个grep
命令将输出限制为块头,第二个grep
命令删除表示添加行的块。
前两个sed
命令删除除范围行号之外的所有内容。
cut
用于获取第一个范围值,即存在于HEAD~1
中的行不存在于HEAD
.
下一个sed
命令去除前导状态字符。
如果在给定的块中仅添加或删除一行,git diff
则将使用 eg+2
作为范围而不是+2,1
。该awk
命令修复了这个问题。
最后,最后一个sed
命令替换为,
,,+
以便git blame
知道第二个值是偏移量而不是行号。
您可以使用 one-liner 输出的每一行(保存到 eg $row
),如下所示:
git blame -L$row HEAD~1 -- $file
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句