- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一系列提交,比如说 HEAD~1
和 HEAD
(即,只是 HEAD
),我想找到 在该范围内更改的行的前几位作者以及他们更改了多少行。
更准确地说:对于范围内更改的每一行,我想得到以前的作者(例如,使用 git blame
)。然后我想根据这些作者总结更改的行。
例如,考虑在HEAD
之前被这些人更改的文件X(我在行首标记了更改行的人,相当于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.
所以 Carl 更改了 Bob 的 2 行,删除了 Bob 的一行,并更改了 Adam 的一行。因此,我的脚本的输出应该是:
鲍勃:3亚当:1
我的整体解决方案是:
-L
参数传递给git blame
以查询以前的作者git blame
的输出并总结,自己完成最后的分组。我目前正在努力解决 1.:获取由 diff 更改的行范围(在本例中为一个范围 3,6)。一旦我有了这些范围,我就可以将它们传递给 git blame -L
以获取这些行的先前作者。 那么如何让 git diff
或其他 git 工具将行范围作为数字 start,end
对返回?
最佳答案
我不知道有什么方法可以告诉 Git 这样做,但我想出了一个解决方案来解析 git diff
的输出以获得您需要的值。
如果你运行 git diff -U0
, 在每个 block 的顶部你会看到这样的东西:
@@ -5,2 +5,3 @@
这意味着从第 5 行开始删除了 2 行,并在那里添加了 3 行。 (-U0
的 git diff
参数 stash 了所有上下文行,因此只打印实际更改的行。如果没有该参数,行号将不正确。)对于给定的 block ,可能会出现三种不同的情况:添加行、删除行或修改行(删除和添加)。前面的示例显示了标题为修改后的行显示的内容。添加的行看起来像这样:
@@ -5,0 +6,2 @@
对于您的用例,我们可以忽略这些行。删除的行看起来像这样:
@@ -5,5 +4,0 @@
请注意,每对中的第二个数字是一个偏移量,显示添加/删除了多少行。谢天谢地,git blame
也可以接受 <end>
的偏移量值,所以我们可以将其修改为 git blame
的格式可以接受。
这是一个bash应该可以解决问题的单行代码:
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
命令将输出限制为 block 头,第二个 grep
命令删除代表添加行的 block 。
前两个sed
命令删除范围行号以外的所有内容。
cut
用于获取第一个范围值,即 HEAD~1
中存在的行HEAD
中不存在的.
下一个sed
命令去除前导状态字符。
如果在给定 block 中只添加或删除一行,git diff
将使用例如+2
作为范围而不是 +2,1
. awk
命令修复了这个问题。
最后一个sed
命令替换 ,
与 ,+
这样git blame
知道第二个值是偏移量而不是行号。
您可以使用单行输出的每一行(保存到例如 $row
),如下所示:
git blame -L$row HEAD~1 -- $file
关于git - 如何在git中找到所有更改行的先前作者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44776778/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!