如何在git中找到所有更改行的先前作者?

杀虫剂

给定一系列提交,比如说HEAD~1HEAD(即,只是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 blamegit 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

我的整体解决方案是:

  1. 查找更改的行范围
  2. 将这些范围与-L参数传递git blame到以查询以前的作者
  3. 通过解析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可以接受的格式

这是一个 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,1awk命令修复了这个问题。

  • 最后,最后一个sed命令替换为,,+以便git blame知道第二个值是偏移量而不是行号。

您可以使用 one-liner 输出的每一行(保存到 eg $row),如下所示:

git blame -L$row HEAD~1 -- $file

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在git上的所有提交中找到所有重命名?

来自分类Dev

如何在R包中找到所有功能?

来自分类Dev

如何在emacs中找到clojure符号的所有参考?

来自分类Dev

如何在Python中找到GridSearchCV的所有参数?

来自分类Dev

(Android)如何在xml文件中找到所有ImageView?

来自分类Dev

如何在代码中找到需要许可的所有部分

来自分类Dev

如何在图像中找到所有矩形瓷砖?

来自分类Dev

如何在元组列表中找到所有最小元素?

来自分类Dev

如何在Azure中找到所有相关/相关资源?

来自分类Dev

如何在Python中找到ID的所有子代?

来自分类Dev

如何在表中找到所有可能的结果jQuery

来自分类Dev

如何在emacs中找到clojure符号的所有参考?

来自分类Dev

如何在jQuery中找到所有删除的元素

来自分类Dev

如何在python protobuff中找到所有消息

来自分类Dev

如何在硬盘中找到所有exe文件?

来自分类Dev

如何在 OpenCV 中找到模板的所有匹配项?

来自分类Dev

如何在 Elasticsearch 中找到所有包含“blah”的对象?

来自分类Dev

如何在Python中使用先前作用域中的变量

来自分类Dev

如何从str中找到所有元素

来自分类Dev

如何在git中找到分支的起源?

来自分类Dev

如何在Git中找到向后合并?

来自分类Dev

如何在git中找到问题原因?

来自分类Dev

如何在数据库Teradata中找到所有带有特定列名的表?

来自分类Dev

如何在有向图中找到所有欧拉路径

来自分类Dev

如何在其数组元素中找到具有特定值的所有实体?

来自分类Dev

如何在文本中找到所有带有特定结尾的单词?

来自分类Dev

如何在特定文件夹中找到没有写权限的所有文件?

来自分类Dev

如何在bash中找到所有不以给定前缀开头的文件?

来自分类Dev

如何在退化树中找到所有从特定顶点开始的均等路径?

Related 相关文章

  1. 1

    如何在git上的所有提交中找到所有重命名?

  2. 2

    如何在R包中找到所有功能?

  3. 3

    如何在emacs中找到clojure符号的所有参考?

  4. 4

    如何在Python中找到GridSearchCV的所有参数?

  5. 5

    (Android)如何在xml文件中找到所有ImageView?

  6. 6

    如何在代码中找到需要许可的所有部分

  7. 7

    如何在图像中找到所有矩形瓷砖?

  8. 8

    如何在元组列表中找到所有最小元素?

  9. 9

    如何在Azure中找到所有相关/相关资源?

  10. 10

    如何在Python中找到ID的所有子代?

  11. 11

    如何在表中找到所有可能的结果jQuery

  12. 12

    如何在emacs中找到clojure符号的所有参考?

  13. 13

    如何在jQuery中找到所有删除的元素

  14. 14

    如何在python protobuff中找到所有消息

  15. 15

    如何在硬盘中找到所有exe文件?

  16. 16

    如何在 OpenCV 中找到模板的所有匹配项?

  17. 17

    如何在 Elasticsearch 中找到所有包含“blah”的对象?

  18. 18

    如何在Python中使用先前作用域中的变量

  19. 19

    如何从str中找到所有元素

  20. 20

    如何在git中找到分支的起源?

  21. 21

    如何在Git中找到向后合并?

  22. 22

    如何在git中找到问题原因?

  23. 23

    如何在数据库Teradata中找到所有带有特定列名的表?

  24. 24

    如何在有向图中找到所有欧拉路径

  25. 25

    如何在其数组元素中找到具有特定值的所有实体?

  26. 26

    如何在文本中找到所有带有特定结尾的单词?

  27. 27

    如何在特定文件夹中找到没有写权限的所有文件?

  28. 28

    如何在bash中找到所有不以给定前缀开头的文件?

  29. 29

    如何在退化树中找到所有从特定顶点开始的均等路径?

热门标签

归档