Edu*_*ipe 325 git whitespace
我有我的文本编辑器在保存文件时自动修剪尾随空格,我正在为一个开源项目做出贡献,该项目在跟踪空白时存在严重问题.
每次我尝试提交补丁时,我必须首先忽略所有仅限空白的更改,以便仅选择相关信息.不仅如此,但是当我跑步时,git rebase
我经常因为它们而遇到几个问题.
因此,我希望能够以类似的方式添加索引非空白更改git add -p
,但不必自己选择所有更改.
有谁知道如何做到这一点?
编辑:我不能改变项目的工作方式,他们在邮件列表上讨论之后决定忽略这一点.
Col*_*ert 376
@Frew解决方案不是我需要的,所以这是我为完全相同的问题所做的别名:
alias.addnw=!sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero -'
Run Code Online (Sandbox Code Playgroud)
或者你可以简单地运行:
git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -
Run Code Online (Sandbox Code Playgroud)
根据此评论,添加了选项-U0
,以及--unidiff-zero
解决方法上下文匹配问题.
基本上它应用了将在add
没有空格更改的情况下应用的补丁.您会注意到,在git addnw your/file
仍然存在未分级的更改之后,它就是剩下的空白.
--no-color不是必需的,但由于我总是设置颜色,我必须使用它.无论如何,比抱歉更安全.
Fre*_*idt 36
这对我有用:
如果你想保留一个存储,这是有效的
git stash && git stash apply && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch
Run Code Online (Sandbox Code Playgroud)
我不喜欢的藏匿处,但我已经运行到混帐+ cygwin的,我失去了变化的缺陷,所以要确保这些东西去了,至少我设置以下的引用日志:
git add . && git commit -am 'tmp' && git reset HEAD^ && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch
Run Code Online (Sandbox Code Playgroud)
基本上我们创建一个不包含空间变化的差异,还原我们所有的变化,然后应用差异.
Ste*_*ers 30
创建仅包含实际更改的修补程序文件(不包括仅包含空格更改的行),然后清理工作区并应用该修补程序文件:
git diff> backup
git diff -w>更改
git reset - 硬
补丁<更改
然后add
和commit
正常情况一样,检查剩余的差异.
Mercurial的等价物是这样做:
hg diff> backup
hg diff -w>更改
hg revert --all
hg import --no-commit changes
voi*_*ter 10
由于评论中的用户根据补丁上下文中的空白,所以在所有情况下,最高投票的答案都不起作用.
我按如下方式修改了命令:
$ git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero
Run Code Online (Sandbox Code Playgroud)
这会生成一个没有上下文的补丁.应该不是问题,因为补丁是短暂的.
相应的别名,再次修改其他用户已经提供的内容:
addw = !sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero' -
Run Code Online (Sandbox Code Playgroud)
Tom*_*ale 10
将以下内容添加到您的.gitconfig
:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
Run Code Online (Sandbox Code Playgroud)
感谢@Colin Herbert对灵感的回答.
语法说明
最终#
必须引用,所以它不被视为内部的注释.gitconfig
,而是被传递并被视为shell中的注释 - 它被插入git apply
到用户提供的参数的末尾和git
自动放置在命令行的结尾.这里不需要这些参数 - 我们不想git apply
使用它们,因此前面的注释字符.您可能希望运行此命令GIT_TRACE=1 git anw
以查看此操作.
--
参数的信号结束,并允许您有一个名为-w
或看起来像切换到的文件的情况git diff
.
需要使用转义的双引号$@
来保留任何用户提供的引用参数.如果"
角色没有被转义,它将被.gitconfig
解析器使用而不会到达shell.
注:.gitconfig
别名解析不承认单引号的任何特殊-它的唯一的特殊字符"
,\
,\n
,和;
(一个外"
-quoted字符串).这就是"
必须总是被转义的原因,即使它看起来像是在一个单引号字符串中(git完全不可知).
这很重要,例如.如果你有一个方便的别名来bash
在工作树的根目录中执行命令.不正确的表述是:
sh = !bash -c '"$@"' -
Run Code Online (Sandbox Code Playgroud)
虽然正确的是:
sh = !bash -c '\"$@\"' -
Run Code Online (Sandbox Code Playgroud)
以下内容如何:
git add `git diff -w --ignore-submodules |grep "^[+][+][+]" |cut -c7-`
Run Code Online (Sandbox Code Playgroud)
反引号内的命令获取具有非空白更改的文件的名称.