Git工具,如果只包含空格中的更改,则从暂存中删除行

mxc*_*xcl 10 git version-control dvcs

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

但是,当与不练习此操作的其他人一起工作时,使用编辑器或预提交钩子删除所有尾随空格会导致更差的差异.你正在做与你的意图相反的事情.

所以我在这里询问是否有一个工具可以在我提交staging之前的unstages行之前手动运行,只是在空白中进行了更改.

另外一个好处是可以更改分段行,以便为具有代码更改的行删除尾随空格.

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

我在这里问我完全打算写这个工具,如果它还不存在的话.

Gre*_*con 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

更新: 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 --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

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