我让我的文本编辑器在保存文件时自动修剪尾随空格,而且我正在为一个开源项目做贡献,该项目在尾随空格方面存在严重问题。
每次我尝试提交一个补丁时,我必须首先手动忽略所有只有空白的更改,只选择相关信息。不仅如此,当我运行git rebase时,我通常会遇到一些问题。
因此,我希望能够仅向索引添加非空白的更改,以类似于git add -p的方式,但不必自己选择所有更改。
有人知道怎么做吗?
编辑:我不能改变项目的工作方式,他们在邮件列表上讨论后决定忽略这一点。
我让我的文本编辑器在保存文件时自动修剪尾随空格,而且我正在为一个开源项目做贡献,该项目在尾随空格方面存在严重问题。
每次我尝试提交一个补丁时,我必须首先手动忽略所有只有空白的更改,只选择相关信息。不仅如此,当我运行git rebase时,我通常会遇到一些问题。
因此,我希望能够仅向索引添加非空白的更改,以类似于git add -p的方式,但不必自己选择所有更改。
有人知道怎么做吗?
编辑:我不能改变项目的工作方式,他们在邮件列表上讨论后决定忽略这一点。
当前回答
这对我来说很管用:
git config apply.whitespace fix
在每次提交使用命令之前:
git add -up .
其他回答
投票最多的答案并不适用于所有情况,因为根据评论中的用户,补丁上下文中有空白。
我将命令修改如下:
$ git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero
这会生成一个没有上下文的补丁。应该不是问题,因为补丁是短暂的。
对应的别名,同样是其他用户已经提供的内容的修订:
addw = !sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero' -
在你的.gitconfig中添加以下内容:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
感谢@Colin Herbert的回答给了我灵感。
语法解释
The final # must be quoted so it's not treated it as a comment inside the .gitconfig, but instead gets passed through and is treated as a comment inside the shell - it is inserted between the end of the git apply and the user-supplied arguments that git automatically places at the end of the command line. These arguments aren't wanted here - we don't want git apply to consume them, hence the preceding comment character. You may want to run this command as GIT_TRACE=1 git anw to see this in action.
——表示参数的结束,并允许你有一个名为-w或类似于git diff开关的文件。
需要在$@周围转义双引号来保存用户提供的引号参数。如果' '字符没有转义,它将被.gitconfig解析器使用,而不会到达shell。
注意:.gitconfig别名解析不识别任何特殊的单引号-它唯一的特殊字符是“,\,\n,和;(在引号字符串之外)。这就是为什么“必须总是转义,即使它看起来像是在单引号字符串中(git完全不知道这一点)。
这很重要。如果您有一个方便的别名,可以在工作树的根中执行bash命令。不正确的说法是:
sh = !bash -c '"$@"' -
而正确的答案是:
sh = !bash -c '\"$@\"' -
首先应该考虑后面的空格是否是有意的。许多项目,包括Linux内核、Mozilla、Drupal和Kerberos(仅列举维基百科页面上关于样式的几个例子)禁止尾随空格。来自Linux内核文档:
找个像样的编辑,别走 行尾的空格。
在您的情况下,问题是反过来的:以前的提交(可能是当前的提交)没有遵循这个指导原则。
我敢打赌,没有人真的想要后面的空格,解决这个问题可能是一个受欢迎的改变。其他用户可能也遇到了与您相同的问题。也有可能添加尾随空格的贡献者没有意识到他们正在这样做。
与其试图重新配置git来忽略这个问题,或者在编辑器中禁用其他理想的功能,我宁愿先在项目邮件列表中发布一篇文章来解释这个问题。许多编辑器(以及git本身)都可以配置为处理尾随空格。
下面这个怎么样:
git add `git diff -w --ignore-submodules |grep "^[+][+][+]" |cut -c7-`
反引号内的命令获取有非空格更改的文件名。
这对我来说很管用:
git config apply.whitespace fix
在每次提交使用命令之前:
git add -up .