402 Stimmen

Nur Änderungen ohne Leerzeichen hinzufügen

Ich habe meinen Texteditor so eingestellt, dass er nachstehende Leerzeichen beim Speichern einer Datei automatisch abschneidet, und ich trage zu einem Open-Source-Projekt bei, das große Probleme mit nachstehenden Leerzeichen hat.

Jedes Mal, wenn ich versuche, einen Patch einzureichen, muss ich zunächst alle Änderungen, die nur aus Leerzeichen bestehen, von Hand ignorieren, um nur die relevanten Informationen auszuwählen. Nicht nur das, sondern wenn ich git rebase In der Regel stoße ich dadurch auf mehrere Probleme.

Als solches möchte ich in der Lage sein, nur Änderungen ohne Leerzeichen in den Index aufzunehmen, ähnlich wie bei git add -p macht, aber ohne dass ich alle Änderungen selbst vornehmen muss.

Weiß jemand, wie man das macht?

EDIT: I kann nicht die Art und Weise, wie das Projekt funktioniert, zu ändern, und sie haben nach einer Diskussion auf der Mailingliste beschlossen, dies zu ignorieren.

461voto

Colin Hebert Punkte 88407

@Frew Lösung war nicht ganz das, was ich brauchte, so ist dies die alias ich für genau das gleiche Problem gemacht:

alias.addnw=!sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero -'

Oder Sie können einfach weglaufen:

git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -

Update

Zusätzliche Optionen -U0 y --unidiff-zero bzw. zur Umgehung von Kontextabgleichsproblemen, nach dieser Kommentar .

Im Grunde wird der Patch angewendet, der mit add ohne Whitespace-Änderungen. Sie werden feststellen, dass nach einer git addnw your/file Es wird immer noch unbearbeitete Änderungen geben, es sind die übrig gebliebenen Leerzeichen.

Die Option --no-color ist nicht erforderlich, aber da ich die Farben auf immer eingestellt habe, muss ich sie verwenden. Wie auch immer, lieber sicher als traurig.

Warnung

Dieser Trick funktioniert zwar an sich, aber wenn Sie versuchen, ihn zu verwenden, um Leerzeilenänderungen mit --ignore-blank-lines dann werden die Dinge kompliziert. Mit dieser Option, git diff lässt einfach einige Teile weg, was den resultierenden Patch verfälscht, da die Zeilennummern in der Zieldatei nicht stimmen werden.

45voto

Steve Pitchers Punkte 6701

Erstellen Sie eine Patchdatei, die nur die wirklichen Änderungen enthält (ohne Zeilen mit reinen Leerzeichenänderungen), bereinigen Sie dann Ihren Arbeitsbereich und wenden Sie diese Patchdatei an:

git diff > Sicherung
git diff -w > Änderungen
git reset --hard
Patch < Änderungen

Überprüfen Sie die verbleibenden Unterschiede, dann add et commit wie gewohnt.

Die Entsprechung für Mercurial ist dies:

hg diff > Sicherung
hg diff -w > Änderungen
hg revert --all
hg import --no-commit Änderungen

40voto

Frew Schmidt Punkte 9234

Das funktioniert bei mir:

Wenn Sie einen Vorrat anlegen wollen, funktioniert das folgendermaßen

git stash && git stash apply && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch

Ich mag die Verstecke nicht, aber ich haben Ich bin auf einen Fehler in Git + Cygwin gestoßen, bei dem ich Änderungen verliere, also habe ich, um sicherzugehen, dass das Zeug wenigstens in das Reflog geht, folgendes eingerichtet:

git add . && git commit -am 'tmp' && git reset HEAD^ && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch

Im Grunde genommen erstellen wir ein Diff, das die Änderungen am Leerzeichen nicht enthält, machen alle unsere Änderungen rückgängig und wenden dann das Diff an.

17voto

void.pointer Punkte 22971

Die am höchsten bewertete Antwort funktioniert nicht in allen Fällen, da laut den Kommentaren der Nutzer Leerzeichen im Kontext des Patches vorkommen.

Ich habe den Befehl wie folgt geändert:

$ git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero

Dies erzeugt einen Patch ohne Kontext. Das sollte kein Problem sein, da der Patch nur kurzlebig ist.

Entsprechender Alias, wiederum eine Überarbeitung dessen, was bereits von anderen Benutzern angegeben wurde:

addw = !sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero' -

13voto

Tom Hale Punkte 32065

Fügen Sie Folgendes zu Ihrem .gitconfig :

anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"

Dank an @Colin Herbert's Antwort für die Inspiration.

Erläuterung der Syntax

Das Finale # muss in Anführungszeichen gesetzt werden, damit es nicht als Kommentar innerhalb der .gitconfig sondern wird stattdessen durchgereicht und innerhalb der Shell wie ein Kommentar behandelt - er wird zwischen das Ende der git apply und die vom Benutzer bereitgestellten Argumente, die git automatisch an das Ende der Befehlszeile gesetzt. Diese Argumente sind hier nicht erwünscht - wir wollen nicht git apply um sie zu verbrauchen, daher das vorangestellte Kommentarzeichen. Vielleicht möchten Sie diesen Befehl als GIT_TRACE=1 git anw um dies in Aktion zu sehen.

En -- signalisiert das Ende der Argumente und berücksichtigt den Fall, dass Sie eine Datei namens -w oder etwas, das aussieht wie ein Schalter zu git diff .

Entgangene doppelte Anführungszeichen um $@ sind erforderlich, um alle vom Benutzer angegebenen Argumente zu erhalten. Wenn die " Zeichen nicht escaped wird, wird es von der .gitconfig Parser und nicht die Shell erreichen.

Nota: .gitconfig alias parsing erkennt einfache Anführungszeichen nicht als etwas Besonderes - die einzigen Sonderzeichen sind " , \ , \n y ; (außerhalb einer " -Zeichenfolge). Deshalb ist eine " muss immer escaped werden, auch wenn es so aussieht, als befände es sich in einer Zeichenkette mit einfachen Anführungszeichen (was Git völlig gleichgültig ist).

Dies ist wichtig, wenn Sie z.B. einen praktischen Alias haben, um eine bash in der Wurzel des Arbeitsbaums. Die falsche Formulierung ist:

sh = !bash -c '"$@"' -

Die korrekte lautet jedoch:

sh = !bash -c '\"$@\"' -

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X