如何让git diff统计变更行数时忽略代码块中的空白行?
解决git diff统计代码变更行数时排除新增空白行的问题
你使用git diff --ignore-all-space --ignore-blank-lines --numstat HEAD统计代码变更时,新增的空白行仍会被计入统计(例如你的示例中实际返回新增2行,但期望是1行)。
问题场景示例
原代码:
public void myCodeChange() { String s = "original" return s; }
修改后代码:
public void myCodeChange() { String s = "changes" return s; }
生成的diff:
public void myCodeChange() { - String s = "original" + String s = "changes" + return s; }
解决方案
方法1:统计全局有效变更行数
如果只需要所有文件的总新增/删除行数,用以下命令过滤掉空白行的变更:
git diff --ignore-all-space HEAD | awk '/^\+[^+]/{plus++} /^-[^-]/{minus++} END{print "新增行数: " plus "\n删除行数: " minus}'
它会跳过diff中仅包含+或-的空白行,只统计实际有代码修改的行。
方法2:保留numstat格式的文件级统计
若要维持numstat的文件级输出格式,可通过脚本循环处理每个变更文件:
git diff --ignore-all-space --numstat HEAD | while read add del file; do real_add=$(git diff --ignore-all-space HEAD "$file" | grep '^\+[^+]' | wc -l) real_del=$(git diff --ignore-all-space HEAD "$file" | grep '^-[^-]' | wc -l) echo "$real_add $real_del $file" done
该脚本会针对每个文件单独统计有效代码变更行数,输出格式与numstat一致,但排除了空白行的统计。
说明
--ignore-blank-lines参数仅忽略空白行自身的修改(比如一行空白变为多行空白),无法忽略新增/删除空白行的情况,因此需要额外过滤来排除这类行的统计。
内容的提问来源于stack exchange,提问作者Dannenberger
相关产品推荐
相关产品推荐

