我很好奇是否可以通过忽略统计输出中的任何换行符来获取更改统计信息 (#inserts/#deletes)?如果我使用 --word-diff
选项进行显式计数并计算添加(由 {+...+}
包围)或删除(由 [-...-]
包围)的匹配行,则计数与stat
。
似乎 git 显示的统计信息包括插入/删除的空行,并且会大大增加它们的计数。
我尝试了 --ignore-blank-lines
的标志和其他 ignore-*
标志无济于事。
例如:
git show --shortstat --format= abcd1234
17 files changed, 471 insertions(+), 392 deletions(-)
如果我像这样进行基于 word-diff
的手动计数,插入的数量会少很多:
git show abcd1234 --first-parent --unified=0 --word-diff --format= | egrep -v "^@|^diff|^new|^index|^---|^\+\+\+" | egrep "{\+.*\+}$" | wc -l
这给出了 402
。重复删除我得到 332
。分别少于 471 次插入和 392 次删除,由 shortstat
输出通过忽略空白行来“匹配”计数的任何方法?如果我不忽略空行,计数就会匹配得很好。
答案 0 :(得分:2)
--word-diff
和常规的“行差异”是不同的算法。
您无法保证“修改行”的计数会匹配。
除此之外:
统计选项(--stat
、--numstat
、--shortstat
)到git diff
或git show
确实与空白差异选项(例如{{3} } 或 --ignore-blank-lines
或 -b | --ignore-space-change
) :
# will only count lines with non trivial changes :
git show -b --shortstat
关于两种算法的区别,
举个简单的例子:
# fileA # fileB
a line a line a line line a line a line a
a line a line a line line a line a line a
a line a line a line line a line a line a
a line a line a line line a line a line a
a line a line a line line a line a line a
"line wise" :您必须删除 fileA
中的所有行才能将其更改为 fileB
,此类补丁的统计信息为 5 insertions, 5 deletions
:
$ git diff --no-index fileA fileB
diff --git a/fileA b/fileB
index 38ef89845..f417ca808 100644
--- a/fileA
+++ b/fileB
@@ -1,5 +1,5 @@
-a line a line a line
-a line a line a line
-a line a line a line
-a line a line a line
-a line a line a line
+line a line a line a
+line a line a line a
+line a line a line a
+line a line a line a
+line a line a line a
"word wise" :您只需删除 a
中的第一个 fileA
,并在 a
的末尾添加一个额外的 fileB
,您的“grep " 命令将计算 1 insertion, 1 deletion
:
$ git diff --word-diff --no-index fileA fileB
diff --git a/fileA b/fileB
index 38ef89845..f417ca808 100644
--- a/fileA
+++ b/fileB
@@ -1,5 +1,5 @@
[-a-]line a line a line a
line a line a line a
line a line a line a
line a line a line a
line a line a line {+a+}