git-add只添加空格更改?

32

我的项目风格确实要求削减尾随空格,但这会使差异非常混乱。我喜欢在提交实际修复之前将它们合并为一个提交。

这与仅添加非空白更改密切相关,但它正在询问正好相反的内容:

有没有一种方法可以只将空格更改添加到暂存区?

3个回答

45

你可以尝试以下“技巧”:

git add -A
git diff --cached -w | git apply --cached -R

这基本上是将所有内容添加到索引中,然后取消暂存影响超过空格的所有更改。


1
关于创建git别名的相关内容:https://dev59.com/MGIk5IYBdhLWcg3wKLWd#19525426。似乎没有什么聪明的技巧可以在别名中使用管道,所以你必须借助shell来实现。 - Sean Allred
当文件预规范化在尾部有两个换行符时(规范化将其修剪为一个),这会导致略微奇怪的行为。 - Sean Allred
@SeanAllred:诚然,这不是我测试过的情况(通常我只在末尾留一个换行符)。那种情况会发生什么? - nneonneo
这个被打印出来了,但是补丁没有被暂存。我通常也只留下一个,但是这些文件非常混乱。我觉得我在做公益事业。 - Sean Allred
我已经禁用了前缀,并且只收到“文件不在索引中”的消息。我需要将-p作为选项添加到git apply命令中。 - cweiske
如果你遇到了 error: unrecognized input 的错误,可能是因为你在 git 配置中设置了颜色。对于我来说,执行 git diff --cached -w --color=never | git apply --cached -R(即禁用差异命令的输出颜色)解决了这个问题。 - danba

3

这里是一个对我有效的Bash解决方案

for fname in $(git diff --name-only  --diff-filter=ACMR --full-index HEAD)
do
   diff=$(git diff -w --ignore-blank-lines --exit-code $fname)
   if [ $? -eq 0 ]; then
      echo "only whitespace diff on $fname ! adding to git..."
      git add $fname
   else
      echo "diff on $fname!"
   fi
done

如果您的文件名包含空格,则此解决方案将无法正常工作。根据 https://dev59.com/hF4c5IYBdhLWcg3wSIgs#48583007 进行修改后,可以使其正常工作。 - gbear605

1

我不得不结合Tobias和nneonneo的答案来提交具有大型差异的多个文件的空格。确保从您的存储库根目录运行此操作。

git add -A
for FILE_NAME in $(git --no-pager diff --name-only --diff-filter=ACMR --full-index HEAD)
do  
    git --no-pager diff --cached -w $FILE_NAME | git apply --cached -R  
done

git --no-pager 可以防止git使用默认滚动来显示大量内容。 --name-only 参数可以让该命令在多个文件上执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接