如何告诉`git log - [num | short] stat`计算空行

时间:2011-08-19 14:10:28

标签: git diff

一般问题

使用git时,如何告诉git log --stat它还应该计算差异中的空行?

代码示例

git clone https://github.com/voldemort/voldemort.git
cd voldemort
git log --numstat -n 1 c21ad76 contrib/hadoop-store-builder/src/java/voldemort/store/readonly/mr/HadoopStoreBuilderReducer.java
git show c21ad76 -- contrib/hadoop-store-builder/src/java/voldemort/store/readonly/mr/HadoopStoreBuilderReducer.java

更多细节

在给定示例git log --numstat提交c21ad76的声明中,该文件HadoopStoreBuilderReducer.java已添加 25 22已删除行。如果您仔细查看该文件的差异输出(git show),您可以看到实际上已添加 30 25个行,其中通过 5添加 3删除行使其不同。仔细观察一下,在添加的行hunk中有5个空行,在删除的行hunk中有4个空行。

此行为与git log --shortstatgit log --stat相同。

在我看来,git log --numstat内所有空行都是计算的。

如何使用git计算每次提交的添加和删除行数包括空行

2 个答案:

答案 0 :(得分:2)

上下文

同一个更改有几个不同的(有效)补丁。主要区别在于使用上下文行。统一差异通常在每次更改之前和之后使用三行上下文。内部git(有时)使用零行上下文,这可能导致不同的更改行。

第一个解决方案:外部工具

正如@ karl-bielefeldt所描述的,可以将git show的结果导入grep -Pc '^\+(?!\+)'grep -Pc '^-(?!-)'。有一个工具diffstat就是这样做的:

$git show c21ad76 -- contrib/hadoop-store-builder/src/java/voldemort/store/readonly/mr/HadoopStoreBuilderReducer.java | diffstat
 HadoopStoreBuilderReducer.java |   57 +++++++++++++++++++++--------------------
 1 file changed, 30 insertions(+), 27 deletions(-)

第二个解决方案:为补丁使用不同的上下文

可以配置git show的输出补丁。使用x的选项“-Ux”可以指定上下文。

$git show -U0 c21ad76 -- contrib/hadoop-store-builder/src/java/voldemort/store/readonly/mr/HadoopStoreBuilderReducer.java | diffstat
 HadoopStoreBuilderReducer.java |   47 +++++++++++++++++++++--------------------
 1 file changed, 25 insertions(+), 22 deletions(-)

这与内部git log --numstat匹配,因为它使用0上下文来计算stat。请注意,此行为即将在git版本1.7.7中更改。使用该numstat使用3行上下文。

答案 1 :(得分:0)

我删除了27个,添加了30个。我不知道是否有办法用内部git做到这一点,但这对我有用:

git show c21ad76 -- contrib/hadoop-store-builder/src/java/voldemort/store/readonly/mr/HadoopStoreBuilderReducer.java | grep -Pc '^\+(?!\+)'
git show c21ad76 -- contrib/hadoop-store-builder/src/java/voldemort/store/readonly/mr/HadoopStoreBuilderReducer.java | grep -Pc '^-(?!-)'