GIT只显示行数"更新"

时间:2017-05-17 03:41:18

标签: git git-diff git-log

只是想知道这是否可以在GIT命令行中使用。

我试图找到行数"更新"两次修改之间。我已经能够找到帮助使用git diff与--stat和--shortstat --numstat选项。它似乎只显示我添加和删除的#行。即使更新了一行,也会将其计为1次删除和1次插入。这是真的?是否有选项或任何实用程序(命令行)给我一个插入,更新和删除的#lines的细分?

1 个答案:

答案 0 :(得分:0)

虽然不存在直接从Git执行此操作的能力(至少从2.13.0开始),但您可以通过解析统一差异来自己完成,前提是您对构成更改行的内容做了一些假设。 / p>

如果N个删除后跟N个添加= N个更改行,那么这里是一个基于GNU awk的解决方案,它只输出统一差异补丁中添加/删除/更改的行数:

BEGIN {
  inhunk = 0
  adds = 0
  deletes = 0
  changes = 0

  hunk_adds = 0
  hunk_deletes = 0
}

function calcChanges() {
  delta = hunk_adds - hunk_deletes
  changes += (hunk_deletes < hunk_adds ? hunk_deletes : hunk_adds)
  adds += (delta > 0 ? delta : 0)
  deletes += (delta < 0 ? -delta : 0)

  hunk_adds = 0
  hunk_deletes = 0
}

/^@@|^diff/ {
  calcChanges()
  inhunk = ($1 == "@@") ? 1 : 0
}

/^+/ {
  if (inhunk) {
    hunk_adds += 1
  }
}

/^-/ {
  if (inhunk) {
    hunk_deletes += 1
  }
}

/^ / {
  if (inhunk && hunk_adds + hunk_deletes > 0) {
    calcChanges()
  }
}

END {
  calcChanges()

  print "Lines added: " adds
  print "Lines deleted: " deletes
  print "Lines changed: " changes
}

此脚本将按如下方式运行:

git diff ... | awk -f path/to/script.awk 

Lines added: 1
Lines deleted: 11
Lines changed: 2

如果在一个Hunk中有N次删除后紧接着N个删除,则上面考虑一组N行被改变。例如:

diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,4 +1,4 @@
 context
-deleted line
-deleted line
+added line
+added line
 context

...计算2个更改的行。

diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,3 +1,4 @@
 context
-deleted line
+added line
+added line
 context

...计为1个更改的行和1个添加的行。

diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,4 +1,3 @@
 context
-deleted line
-deleted line
+added line
 context

...计为1个更改的行和1个删除的行。

最后,

diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,6 +1,6 @@
 context
+added line
 context
-deleted line
+added line
 context
-deleted line
 context

...计为1个添加的行,1个更改的行,1个删除的行。

可以扩展脚本以列出每个文件的这些统计信息,但我一直保持简单,以显示一般的想法。