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

时间:2011-07-04 12:40:49

标签: git whitespace patch

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

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

4 个答案:

答案 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存在危险,因此存在危险(它不会保留对写入的二进制文件的更改)。也许你想要一个类似于

的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 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