你怎么结合git add patch

我怎么能做补丁模式的git添加,但忽略空白的变化。

该用例用于重新格式化文件并对其进行更改。 我想先提交真正的代码更改(如git diff -w path所示),然后将重新格式化为单独提交。


我建议简单地往返差异

理念:

git diff --ignore-all-space | (git reset --hard && git apply)

警告 :由于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
}

Afaict看起来很有用的--binary选项来比较不符合空白忽略标志


这是对相关问题的改编。

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 .

请记住,您正在删除要保留的更改。 重复并根据需要进行提交,直到只剩下空白更改为止。


@“Justin C”的答案更强大和多用途的版本是:

anw = !git diff -U0 -w --no-color -- "$@" | git apply --cached --ignore-whitespace --unidiff-zero "#"
  • 没有参数 - 添加所有跟踪文件的非空白变化
  • 给定文件/目录 - 仅在这些位置添加非空白变化
  • 看到这个答案更多。

    链接地址: http://www.djcxy.com/p/9827.html

    上一篇: How can you combine git add patch

    下一篇: Cannot apply stash to working directory