Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git工具,用于从暂存中删除仅包含空格更改的行_Git_Version Control_Dvcs - Fatal编程技术网

Git工具,用于从暂存中删除仅包含空格更改的行

Git工具,用于从暂存中删除仅包含空格更改的行,git,version-control,dvcs,Git,Version Control,Dvcs,删除尾随空格的要点是,如果每个人都总是这样做,那么您最终会得到一个最小的差异,即它只包含代码更改,而不包含空格更改 但是,当与其他不这样做的人一起工作时,使用编辑器或预提交挂钩删除所有尾随空格会导致更严重的差异。您的做法与您的意图相反 因此,我在这里询问,在我提交从暂存中取消显示仅为空白更改的行之前,是否有一个工具可以手动运行 另外一个好处是更改暂存行,删除代码更改行的尾随空格 另外一个额外的好处是,不要对标记文件执行此操作(因为尾随空格在标记中有意义) 我在这里发问,因为我完全打算编写这个工具

删除尾随空格的要点是,如果每个人都总是这样做,那么您最终会得到一个最小的差异,即它只包含代码更改,而不包含空格更改

但是,当与其他不这样做的人一起工作时,使用编辑器或预提交挂钩删除所有尾随空格会导致更严重的差异。您的做法与您的意图相反

因此,我在这里询问,在我提交从暂存中取消显示仅为空白更改的行之前,是否有一个工具可以手动运行

另外一个好处是更改暂存行,删除代码更改行的尾随空格

另外一个额外的好处是,不要对标记文件执行此操作(因为尾随空格在标记中有意义)


我在这里发问,因为我完全打算编写这个工具,如果它还不存在的话。

以下内容将为您提供大部分方法:

$ clean=`git diff --cached -b`; \ git apply --cached <(git diff --cached -R); \ echo "$clean" | git apply --cached -; \ clean= 更新:git的1.7.0版本

假设我们的存储库处于以下状态:

$ git diff --cached diff --git a/foo b/foo index 3b18e51..a75018e 100644 --- a/foo +++ b/foo @@ -1 +1,2 @@ -hello world +hello world +howdy also $git diff--缓存 diff——git a/foo b/foo 索引3b18e51..a75018e 100644 ---阿福 +++食宿 @@ -1 +1,2 @@ -你好,世界 +你好,世界 +你好 然后,我们可以运行上述命令来分叉索引和工作树:

$ git diff --cached diff --git a/foo b/foo index 3b18e51..1715a9b 100644 --- a/foo +++ b/foo @@ -1 +1,2 @@ hello world +howdy also $ git diff diff --git a/foo b/foo index 1715a9b..a75018e 100644 --- a/foo +++ b/foo @@ -1,2 +1,2 @@ -hello world +hello world howdy also $git diff--缓存 diff——git a/foo b/foo 索引3b18e51..1715a9b 100644 ---阿福 +++食宿 @@ -1 +1,2 @@ 你好,世界 +你好 $git diff diff——git a/foo b/foo 索引1715a9b..a75018e 100644 ---阿福 +++食宿 @@ -1,2 +1,2 @@ -你好,世界 +你好,世界 你好 如果所有更改仅为空白,您将看到

error: No changes 错误:没有更改
我怀疑修复索引并在工作树中留下不必要的更改会让大多数用户感到惊讶甚至恼火,但这正是问题所要求的行为。

多年来我一直在使用基于,但在某个时刻,git更改了
git diff-b
的输出,因此它没有显示为更改的空白更改被包含在补丁上下文行的after状态中,而不是before状态中

我发现,如果我反转干净的diff和相应的apply,脚本将再次工作

因此,我的完整脚本通常如下所示:

#!/bin/bash

clean=`git diff --cached -b`
git apply --cached <(git diff --cached -R)
echo "$clean" | git apply --cached -
clean=
#/bin/bash
clean=`git diff--cached-b`

git apply--cached我在git 1.7.2.5上的解决方案如下(开始时,没有进行任何更改):

这将使您的回购协议回到初始状态,并删除所有仅限空格的更改


然后,您可以像往常一样进行更改。

有趣的问题。如果它还不存在,听起来像是一个有用的工具。这不是一个非常棘手的解析问题,但一定要让我们知道你最终会做什么。仅供参考,修改你的git版本可能会使空白问题更易于管理。这对我有用。请看我的问题:smiles@Max我的回答中描述的行为出现在v1.7.0版本中:更新是否表示它不再因空格更改而失败?当您已经进行了两次更改,并且还进行了空格更改时,这一点尤其有用。 error: No changes
#!/bin/bash

clean=`git diff --cached -b`
git apply --cached <(git diff --cached -R)
echo "$clean" | git apply --cached -
clean=
#!/bin/bash

clean=`git diff --cached -b -R`
git apply --cached <(git diff --cached -R)
echo "$clean" | git apply --cached -R -
clean=
git apply --cached -R <(git diff --cached -w)
git diff -w > temp.patch
git stash
git apply --ignore-space-change --ignore-whitespace temp.patch
# tidy up:
rm temp.patch
git stash drop