2009-11-17 29 views
10

点变化在去除尾随空白的是,如果每个人都总是那么你最终有一个差异是最小的,即删除线。它只包含代码更改而不是空白的更改。的Git工具从分期,如果他们只包括在空白

但是,当与其他人不练习此操作时,使用编辑器或预先提交钩子删除所有尾随空白将导致更差差异。你的意图正好相反。

所以我问这里是否有那个我承诺之前,我可以手动运行一个工具,从分期unstages线是在空白的唯一变化。

此外奖金是改变分阶段线具有尾随空白对具有代码的变化线除去。

而且奖金将是无法做到这一点,以降价的文件(如尾部的空格在降价了的意思)。

我问这里我完全打算,如果它不存在写此工具。

+0

有趣的问题。听起来像一个有用的工具,如果它不存在。不是一个非常棘手的解析问题,但是让我们知道你最终做了什么。 – 2009-11-17 20:47:55

+0

仅供参考,撞上你的git版本可能会使得空白问题变得更加可管理。它为我工作。在这里看到我的问题:http://stackoverflow.com/questions/1316364/git-whitespace-woes * smiles * – Kzqai 2009-11-17 23:48:51

+0

@Max我的答案中描述的行为是在v1.7.0版本:http://www.kernel。 org/pub/software/scm/git/docs/RelNotes-1.7.0.txt – 2010-02-13 18:08:37

回答

8

下面将让你的大部分的方式有:

$ clean=`git diff --cached -b`; \ 
    git apply --cached <(git diff --cached -R); \ 
    echo "$clean" | git apply --cached -; \ 
    clean=

对于之前的1.7.0的Git版本中,如果一个或多个文件都空白改变它失败。例如

$ git diff --cached -b 
diff --git a/file1 b/file1 
index b2bd1a5..3b18e51 100644 
diff --git a/file2 b/file2 
new file mode 100644 
index 0000000..092bfb9 
--- /dev/null 
+++ b/file2 
[...]

空三角形(的file1以上,这真的应该被抑制)使得git-apply不快:

fatal: patch with only garbage at line 3

UPDATE: GIT中fixes this issue的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 --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

如果所有的改变都是空白,只有,你会看到

error: No changes

我怀疑修复索引并在工作中留下不希望的变化树会让大多数用户感到惊讶甚至不愉快,但这就是问题所要求的行为。

+0

更新是否表明它不会因空白变化而失败? – rjmunro 2010-03-30 12:39:27

+0

@rjmunro是的!查看(重新)更新的答案。 – 2010-03-30 21:12:10

2

我一直在使用基于@GregBacon's answer多年的脚本,但在某些时候,git改变了输出git diff -b,以便空白改变它没有显示,因为修改被包括在后面状态中的修补上下文行中而不是之前的状态。

我发现,如果我颠倒了干净的差异和相应的应用,脚本将再次工作。

所以我使用看起来像这样完整的脚本:

#!/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) 
4

我的混帐1.7.2.5溶液如下(起始没有任何更改上演):

git diff -w > temp.patch 
git stash 
git apply --ignore-space-change --ignore-whitespace temp.patch 
# tidy up: 
rm temp.patch 
git stash drop 

这使得你的回购回到起始状态有任何空白只有更改被删除。

然后,您可以照常进行更改。

+0

当你做了两个改变时,这应该被“git add -p”*分开,并且你也进行了空白改变。 – MKaras 2014-08-16 14:45:23