我很好奇,是否可以通过忽略stats输出中的任何换行符来获得更改状态(#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
的输出都可以通过忽略空白行来“匹配”计数?如果我不忽略空行,计数就会匹配得很好。
发布于 2021-07-12 07:13:29
--word-diff
和规则的“线差”是不同的算法。
您无法保证“修改行”的计数将匹配。
除此之外:
stat选项(--stat
、--numstat
、--shortstat
)与git diff
或git show
的空格diff选项(例如--ignore-blank-lines
或-b | --ignore-space-change
或-w | --ignore-all-space
)相结合:
# 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
“逐行”:您必须删除fileA
中的所有行才能将其更改为fileB
,此修补程序的stat为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
“言外之意”:您只需删除fileA
中的第一个a
,并在fileB
末尾添加一个额外的a
,您的"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+}
https://stackoverflow.com/questions/68340920
复制相似问题