如何将git add patch -p模式与diff的ignore-all-space结合起来

Sam*_*Sam 30 git whitespace patch

如何使用补丁模式执行git add但忽略空格更改.

用例适用于您重新格式化文件并对其进行更改的情况.我想首先单独提交实际代码更改(如git diff -w path所示),然后将重新格式化提交为单独的提交.

Jus*_*n C 23

这是相关问题的改编.

git diff -w --no-color | git apply --cached --ignore-whitespace
Run Code Online (Sandbox Code Playgroud)

它的好处是您不需要使用stash,临时文件或reset --hard在您的工作文件夹上执行.

附录

上面的解决方案只分阶段更改,除了仅限空白的编辑.这并没有解决补丁问题,尽管--patch在这种情况下使用阶段并不是直截了当的.

补丁选项1:在文本编辑器中编辑差异

有许多方法可以使用文本编辑器来实现它.Vim特别适合这个.

在存储库的根目录中,启动Vim.

在正常模式下,将diff加载到空缓冲区中...

:r !git diff -w --no-color
:set ft=diff  # if you want syntax highlighting
Run Code Online (Sandbox Code Playgroud)

编辑差异并删除不想要分段的部分.

要暂存vim缓冲区的内容,请运行vim ex命令...

:w !git apply --cached --ignore-whitespace
Run Code Online (Sandbox Code Playgroud)

如果您是Vim afficionado,您也可以使用视觉模式进行舞台演出!

:<',>'w !git apply --cached --ignore-whitespace
Run Code Online (Sandbox Code Playgroud)

您可以使用ex命令提交暂存的更改...

:!git commit -m "message"
# or
:!git commit
Run Code Online (Sandbox Code Playgroud)

清除缓冲区,读取未分级的更改,然后重复

:bd! | set ft=diff | r !git diff -w --no-color
Run Code Online (Sandbox Code Playgroud)

最终,您只需要进行空白更改即可提交.

如果您不使用Vim,您也可以转储git diff到文件,编辑文件,保存,然后将文件输入git apply.提交并重复直到完成.它有点乏味,但功能齐全.

补丁选项2:补丁重置

它是向后的git add --patch,但是一旦你用非空间变化进行了......

git diff -w --no-color | git apply --cached --ignore-whitespace
Run Code Online (Sandbox Code Playgroud)

...你可以用补丁模式取消分块...

git reset --patch .
Run Code Online (Sandbox Code Playgroud)

请记住,您要删除要保留的更改.根据需要重复并提交,直到您只剩下空白更改.

  • 那太棒了.在Visual Studio大量遍历web.config之后非常有用. (4认同)

seh*_*ehe 1

注意:这个答案是旧的。六年后,贾斯汀的另一个答案要好得多。更喜欢使用git apply --cached

我建议简单地往返差异

主意:

git diff --ignore-all-space | (git reset --hard && git apply)
Run Code Online (Sandbox Code Playgroud)

警告:这充满了危险,因为git reset(它不会保留对二进制文件写入的更改)。也许你想要一个类似的 bash 函数

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
}
Run Code Online (Sandbox Code Playgroud)

由于 diff 看似有用的--binary选项不尊重空白忽略标志