2009-11-17 4 views
10

Der Punkt beim Entfernen von nachfolgenden Leerzeichen ist, dass, wenn jeder es immer dann tun Sie am Ende mit einem Diff, das ist minimal, dh. Es besteht nur aus Codeänderungen und nicht aus Leerzeichenänderungen.Git-Tool zum Entfernen von Zeilen aus dem Staging, wenn sie nur aus Änderungen in Whitespace bestehen

Allerdings, wenn Sie mit anderen Leuten arbeiten, die dies nicht praktizieren, führt das Entfernen aller nachfolgenden Leerzeichen mit Ihrem Editor oder einem Vorab-Haken zu einem noch schlechteren diff. Sie tun das Gegenteil Ihrer Absicht.

Also frage ich hier, ob es ein Tool gibt, das ich manuell ausführen kann, bevor ich festlege, dass Zeilen vom Staging verschoben werden, die nur Änderungen in Leerzeichen sind.

Auch ein Bonus wäre, die gestaffelte Zeile so zu ändern, dass für Zeilen mit Codeänderungen nachgestellte Leerzeichen entfernt werden.

Auch ein Bonus wäre, dies zu Markdown-Dateien nicht zu tun (als Trailing Space hat Bedeutung in Markdown).

Ich frage hier, wie ich dieses Tool vollständig schreiben möchte, wenn es nicht bereits existiert.

+0

Interessante Frage. Klingt wie ein nützliches Werkzeug, wenn es nicht bereits existiert. Kein wirklich kniffliges Parsing-Problem, aber lassen Sie uns wissen, was Sie tun. –

+0

Nur FYI, Ihre git-Version stoßen kann Whitespace-Probleme viel mehr managable machen. Es hat für mich funktioniert. Siehe meine Frage hier: http://stackoverflow.com/questions/1316364/git-whitespace-woes * lächelt * – Kzqai

+0

@Max Das in meiner Antwort beschriebene Verhalten ist in der Version 1.7.0: http: //www.kernel. org/pub/software/scm/git/docs/RelNotes-1.7.0.txt –

Antwort

8

Nachfolgend erhalten Sie die meisten der Weg dorthin gelangen:

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

Für Versionen von git vor 1.7.0, versagt es, wenn eine oder mehrere Dateien all-Änderungen in Leerzeichen haben. Zum Beispiel

$ 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 
[...]

Das leere delta (von file1 oben, das eigentlich soll unterdrückt werden) macht git-apply unglücklich:

fatal: patch with only garbage at line 3

UPDATE: Die 1.7.0 Version von git fixes this issue.

Sagen Sie unser Repository in folgendem Zustand ist:

$ 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

Wir könnten dann die oben genannten Befehle ausführen, um den Index- und Arbeits Baum Gabel:

$ 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

Wenn alle Änderungen nur aus Leerzeichen sind, Sie werden sehen

Ich vermute, den Index zu fixieren und unerwünschte Änderungen in der Arbeit zu verlassen Baum würde die meisten Benutzer überraschen oder sogar irritieren, aber das ist das Verhalten, um das die Frage gebeten wurde.

+0

Ist das Update so, dass es bei Whitespace-Änderungen nicht mehr fehlschlägt? – rjmunro

+0

@rjmunro Ja! Siehe (re) aktualisierte Antwort. –

2

Ich hatte einen Skript auf Basis von @GregBacon's answer seit Jahren, aber an einem gewissen Punkt git verändern die Ausgabe von git diff -b, so dass die Änderungen in Leerzeichen es nicht zeigen, wie Änderungen wurden in den Patch-Kontextzeilen im nach Zustand enthält eher als der vorherige Zustand.

Ich habe gefunden, wenn ich das saubere diff und die entsprechende Anwendung umkehrte, würde das Skript wieder funktionieren.

Also meine komplette Skript aussehen wie folgt verwendet:

#!/bin/bash 

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

Und sieht nun wie:

#!/bin/bash 

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

ich auch ein Skript müssen nur Änderungen in Leerzeichen in einem Commit zu verlassen. Dies ist nützlich, wenn Sie bei der Behebung von Fehlern an einer anderen Stelle der Datei Whitespace-Fixes vornehmen und die Whitespace-Fixes zuerst in einem separaten Commit festschreiben möchten. Es ist einfach:

git apply --cached -R <(git diff --cached -w) 
4

Meine Lösung auf git 1.7.2.5 wurde wie folgt (beginnend ohne alle Änderungen aufgeführt):

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

Dies lässt Ihre Repo zurück in den Ausgangszustand mit einem beliebigen Leerzeichen Nur Änderungen entfernt.

Sie können Ihre Änderungen dann wie gewohnt durchführen.

+0

Dies ist besonders nützlich, wenn Sie zwei Änderungen vorgenommen haben, die durch "git add -p" * und * getrennt werden sollen. – MKaras

Verwandte Themen