我让我的文本编辑器在保存文件时自动修剪尾随空格,而且我正在为一个开源项目做贡献,该项目在尾随空格方面存在严重问题。
每次我尝试提交一个补丁时,我必须首先手动忽略所有只有空白的更改,只选择相关信息。不仅如此,当我运行git rebase时,我通常会遇到一些问题。
因此,我希望能够仅向索引添加非空白的更改,以类似于git add -p的方式,但不必自己选择所有更改。
有人知道怎么做吗?
编辑:我不能改变项目的工作方式,他们在邮件列表上讨论后决定忽略这一点。
我让我的文本编辑器在保存文件时自动修剪尾随空格,而且我正在为一个开源项目做贡献,该项目在尾随空格方面存在严重问题。
每次我尝试提交一个补丁时,我必须首先手动忽略所有只有空白的更改,只选择相关信息。不仅如此,当我运行git rebase时,我通常会遇到一些问题。
因此,我希望能够仅向索引添加非空白的更改,以类似于git add -p的方式,但不必自己选择所有更改。
有人知道怎么做吗?
编辑:我不能改变项目的工作方式,他们在邮件列表上讨论后决定忽略这一点。
当前回答
下面这个怎么样:
git add `git diff -w --ignore-submodules |grep "^[+][+][+]" |cut -c7-`
反引号内的命令获取有非空格更改的文件名。
其他回答
下面这个怎么样:
git add `git diff -w --ignore-submodules |grep "^[+][+][+]" |cut -c7-`
反引号内的命令获取有非空格更改的文件名。
首先应该考虑后面的空格是否是有意的。许多项目,包括Linux内核、Mozilla、Drupal和Kerberos(仅列举维基百科页面上关于样式的几个例子)禁止尾随空格。来自Linux内核文档:
找个像样的编辑,别走 行尾的空格。
在您的情况下,问题是反过来的:以前的提交(可能是当前的提交)没有遵循这个指导原则。
我敢打赌,没有人真的想要后面的空格,解决这个问题可能是一个受欢迎的改变。其他用户可能也遇到了与您相同的问题。也有可能添加尾随空格的贡献者没有意识到他们正在这样做。
与其试图重新配置git来忽略这个问题,或者在编辑器中禁用其他理想的功能,我宁愿先在项目邮件列表中发布一篇文章来解释这个问题。许多编辑器(以及git本身)都可以配置为处理尾随空格。
我发现了一个git预提交钩子,它删除了尾随的空白。但是,如果您不能让其他人使用它,那么它可能不是一个有效的解决方案。
#!/bin/sh
if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq` ; do
# Fix them!
sed -i 's/[[:space:]]*$//' "$FILE"
done
exit
创建一个只包含真正更改的补丁文件(不包括只有空白更改的行),然后清理工作空间并应用该补丁文件:
Git diff >备份 Git diff -w >变化 Git重置——很难 补丁<更改
检查剩余的差异,然后像往常一样添加和提交。
Mercurial的等效功能是这样做的:
Hg diff > backup Hg diff -w >变化 Hg回复——全部 Hg导入——不提交更改
这对我来说很管用:
如果你想藏点,这招管用
git stash && git stash apply && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch
我不喜欢存储,但我在git + cygwin中遇到了一个错误,我失去了变化,所以为了确保东西去了reflog,至少我设置了以下内容:
git add . && git commit -am 'tmp' && git reset HEAD^ && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch
基本上,我们创建了一个不包括空格更改的diff,还原所有更改,然后应用diff。