我让我的文本编辑器在保存文件时自动修剪尾随空格,而且我正在为一个开源项目做贡献,该项目在尾随空格方面存在严重问题。
每次我尝试提交一个补丁时,我必须首先手动忽略所有只有空白的更改,只选择相关信息。不仅如此,当我运行git rebase时,我通常会遇到一些问题。
因此,我希望能够仅向索引添加非空白的更改,以类似于git add -p的方式,但不必自己选择所有更改。
有人知道怎么做吗?
编辑:我不能改变项目的工作方式,他们在邮件列表上讨论后决定忽略这一点。
我让我的文本编辑器在保存文件时自动修剪尾随空格,而且我正在为一个开源项目做贡献,该项目在尾随空格方面存在严重问题。
每次我尝试提交一个补丁时,我必须首先手动忽略所有只有空白的更改,只选择相关信息。不仅如此,当我运行git rebase时,我通常会遇到一些问题。
因此,我希望能够仅向索引添加非空白的更改,以类似于git add -p的方式,但不必自己选择所有更改。
有人知道怎么做吗?
编辑:我不能改变项目的工作方式,他们在邮件列表上讨论后决定忽略这一点。
当前回答
创建一个只包含真正更改的补丁文件(不包括只有空白更改的行),然后清理工作空间并应用该补丁文件:
Git diff >备份 Git diff -w >变化 Git重置——很难 补丁<更改
检查剩余的差异,然后像往常一样添加和提交。
Mercurial的等效功能是这样做的:
Hg diff > backup Hg diff -w >变化 Hg回复——全部 Hg导入——不提交更改
其他回答
类似于@void。指针的答案,但修复最近的提交。
git reset --mixed HEAD^
git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -
这将使空白更改不进行,而其余更改将进行。
@Frew解决方案不是我所需要的,所以这是我为完全相同的问题所做的别名:
alias.addnw=!sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero -'
或者你可以简单地运行:
git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -
更新
根据此注释,分别添加选项-U0和——unidiff-zero来解决上下文匹配问题。
基本上,它应用的补丁将应用添加没有空格更改。你会注意到在git addnw你的/文件之后,仍然会有非阶段性的变化,它是空白。
no-color不是必需的,但我把颜色设置为always,我必须使用它。总之,小心总比后悔好。
警告
虽然这个技巧按原样工作,但如果您尝试使用它来删除——ignore-blank-lines的空行更改,那么事情就会变得复杂。使用这个选项,git diff只会删除一些块,使结果补丁伪造,因为目标文件中的行号将是关闭的。
投票最多的答案并不适用于所有情况,因为根据评论中的用户,补丁上下文中有空白。
我将命令修改如下:
$ 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' -
这对我来说很管用:
git config apply.whitespace fix
在每次提交使用命令之前:
git add -up .
我发现了一个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