如何使用补丁模式进行git add但忽略空格更改。
用例适用于您重新格式化文件并对其进行更改的情况。我想首先单独提交实际的代码更改(如git diff -w path所示),然后将重新格式化提交为单独的提交。
答案 0 :(得分:21)
以下是来自related question的改编。
git diff -w --no-color | git apply --cached --ignore-whitespace
它的好处是您不需要在工作文件夹中使用stash
,临时文件或执行reset --hard
。
附录
上述解决方案仅分阶段更改,除了仅限空格的编辑。这并没有解决补丁问题,但在这种情况下使用--patch
进行分阶段并不是直接的。
修补程序选项1:在文本编辑器中编辑差异
有很多方法可以使用文本编辑器来实现它。 Vim特别适合这个。
在存储库的根目录中,启动Vim。
在正常模式下,使用...
将diff加载到空缓冲区中:r !git diff -w --no-color
:set ft=diff # if you want syntax highlighting
编辑差异并删除您不想分段的部分。
要暂存vim缓冲区的内容,请运行vim ex命令...
:w !git apply --cached --ignore-whitespace
如果您是Vim afficionado,您也可以使用视觉模式进行舞台演出!
:<',>'w !git apply --cached --ignore-whitespace
您可以使用ex命令提交暂存的更改...
:!git commit -m "message"
# or
:!git commit
清除缓冲区,读取未分级的更改,然后重复
:bd! | set ft=diff | r !git diff -w --no-color
最终,您只需要进行空白更改即可提交。
如果您不使用Vim,您也可以将git diff
转储到文件中,编辑文件,保存,然后将文件输入git apply
。提交并重复直到完成。这有点乏味,但功能齐全。
补丁选项2:补丁重置
它是git add --patch
的后退,但是一旦你用...发布了非空白的变化
git diff -w --no-color | git apply --cached --ignore-whitespace
...您可以使用...
以补丁模式取消暂停git reset --patch .
请注意,您要删除要保留的更改。根据需要重复并提交,直到您只剩下空白更改。
答案 1 :(得分:1)
注意:这个答案很旧。未来6年,贾斯汀的另一个答案要好得多。更喜欢使用
git apply --cached
我建议简单地转一个差异
点子:
git diff --ignore-all-space | (git reset --hard && git apply)
警告:由于git reset
存在危险,因此存在危险(它不会保留对写入的二进制文件的更改)。也许你想要一个类似于
function cleanup_patch()
{
if [ $# -lt 1 ]; then
echo 'Must provide explicit paths (wildcards allowed)';
else
git diff --ignore-all-space -- "$@" |
(git checkout HEAD -- "$@" &&
git apply)
fi
}
Afaict看似有用的--binary
diff选项不尊重空格忽略标志
答案 2 :(得分:1)
@ Justin C的答案是一个更强大和多才多艺的版本:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
有关详情,请参阅this answer。
答案 3 :(得分:1)
如果你想做git add --patch但忽略提问者要求的所有空格,你可以在一个命令中执行此操作:
git diff -w --no-color | git apply --cached --ignore-whitespace && git checkout -- . && git reset && git add -p
git diff -w --no-color
创建差异
git apply --cached --ignore-whitespace
应用diff ignore whitepace,并将其编入索引
git checkout -- .
删除未编入索引的“空白”更改
git reset
将索引重置为非空白更改
git add -p
在补丁模式中添加非空白更改
将其包含在别名中,如下所示:
alias gwap=“git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero && git checkout -- . && git reset && git add -p”
或者如果您使用的是基于unix的系统:
gwap= !git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero && git checkout -- . && git reset && git add -p
(注意我根据this comment.分别添加了选项-U0
和--unidiff-zero
以解决方法上下文匹配问题
来源:https://til.hashrocket.com/posts/696df00135-remove-whitespace-changes-then-git-add-p