Ich habe meinen Texteditor, um nachgestellte Leerzeichen beim Speichern einer Datei automatisch zu kürzen, und ich trage zu einem Open-Source-Projekt bei, das schwerwiegende Probleme mit nachgestellten Leerzeichen hat.
Jedes Mal, wenn ich versuche, einen Patch einzureichen, muss ich zuerst alle Nur-Leerzeichen-Änderungen von Hand ignorieren, um nur die relevanten Informationen auszuwählen. Nicht nur das, aber wenn ich renne, stoße git rebase
ich normalerweise auf mehrere Probleme.
Als solches möchte ich in der Lage sein, nur Nicht-Leerzeichen-Änderungen zum Index hinzuzufügen, ähnlich wie dies der git add -p
Fall ist, ohne jedoch alle Änderungen selbst auswählen zu müssen.
Weiß jemand, wie man das macht?
BEARBEITEN: Ich kann die Funktionsweise des Projekts nicht ändern, und sie haben beschlossen, dies zu ignorieren, nachdem sie es auf der Mailingliste besprochen haben.
quelle
git apply --ignore-whitespace
sonst würde der Patch aus offensichtlichen Gründen nicht gelten.git add -w
tat dies.patch does not apply
underror while searching for
... Irgendwelche Ideen?patch does not apply
Fehler erhalten.git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero
. Dies ist nicht riskant, da der Index bereits so aktuell wie möglich ist und somit eine zuverlässige Basis für den Patch darstellt.Das funktioniert bei mir:
Wenn Sie einen Vorrat behalten möchten, funktioniert dies
Ich mag die Stashes nicht, aber ich bin auf einen Fehler in git + cygwin gestoßen, bei dem ich Änderungen verliere. Um sicherzustellen, dass die Dinge zumindest zum Reflog gingen, habe ich Folgendes eingerichtet:
Grundsätzlich erstellen wir ein Diff, das die Leerzeichenänderungen nicht enthält, setzen alle unsere Änderungen zurück und wenden dann das Diff an.
quelle
git stash
statt Auschecken eine Sicherungskopie Ihrer Änderungen erstellen, zumindest bis diese getestet wurden.Erstellen Sie eine Patch-Datei, die nur die tatsächlichen Änderungen enthält (ausgenommen Zeilen mit nur Leerzeichenänderungen), bereinigen Sie dann Ihren Arbeitsbereich und wenden Sie diese Patch-Datei an:
Überprüfen Sie die verbleibenden Unterschiede dann
add
undcommit
wie gewohnt.Das Äquivalent für Mercurial lautet:
quelle
Die Antwort mit der höchsten Bewertung funktioniert nicht in allen Fällen, da die Benutzer in den Kommentaren Leerzeichen im Patch-Kontext verwenden.
Ich habe den Befehl wie folgt überarbeitet:
Dies erzeugt einen Patch ohne Kontext. Sollte kein Problem sein, da der Patch nur von kurzer Dauer ist.
Entsprechender Alias, erneut eine Überarbeitung dessen, was bereits von anderen Benutzern bereitgestellt wurde:
quelle
--ignore-space-change
stattdessen verwenden-w
.git diff -U0 --ignore-space-change --no-color | git apply --cached --unidiff-zero
--ignore-blank-lines
anderen zu verwenden. Sie werden feststellen, dass Diff-Chunks mit falschen Offsets gepatcht werden, wenn einige der Änderungen des Leerraums, die Sie ignorieren möchten, das Entfernen / Hinzufügen von Leerzeilen sind.Fügen Sie Folgendes hinzu
.gitconfig
:Vielen Dank an @Colin Herberts Antwort für die Inspiration.
Syntax Erläuterung
Das Finale
#
muss in Anführungszeichen gesetzt werden, damit es nicht.gitconfig
als Kommentar in der Shell behandelt wird, sondern durchgereicht wird und als Kommentar in der Shell behandelt wird. Es wird zwischen dem Ende desgit apply
und den vom Benutzer angegebenen Argumenten eingefügt , diegit
automatisch am platziert werden Ende der Befehlszeile. Diese Argumente sind hier nicht erwünscht - wir wollen sie nichtgit apply
verbrauchen, daher das vorhergehende Kommentarzeichen. Möglicherweise möchten Sie diesen Befehl ausführenGIT_TRACE=1 git anw
, um dies in Aktion zu sehen.Das
--
Signal endet mit Argumenten und berücksichtigt den Fall, dass Sie eine Datei mit dem Namen-w
oder etwas haben, zu dem ein Wechsel aussehen würdegit diff
.Es sind doppelte Anführungszeichen
$@
erforderlich, um vom Benutzer angegebene Anführungszeichen zu erhalten. Wenn die"
Zeichen nicht maskiert wird, wird es vom.gitconfig
Parser verbraucht und erreicht die Shell nicht.Hinweis:
.gitconfig
Alias - Parsing Apostrophe als etwas Besonderes nicht erkennt - seine einzigen Sonderzeichen sind"
,\
,\n
und;
(außerhalb eines"
-quoted string). Dies ist der Grund, warum ein"
Muss immer maskiert werden muss, auch wenn es so aussieht, als ob es sich in einem String in einfachen Anführungszeichen befindet (worüber Git völlig agnostisch ist).Dies ist wichtig, z. Wenn Sie einen praktischen Alias haben, um einen
bash
Befehl im Stammverzeichnis des Arbeitsbaums auszuführen . Die falsche Formulierung lautet:Während der richtige ist:
quelle
Wie wäre es mit folgendem:
Der Befehl in Backquotes ruft die Namen von Dateien ab, deren Nicht-Leerzeichen geändert wurden.
quelle
git add `git diff -w |grep '^+++' |cut -c7-`
wenn Submodule nicht verwendet werdenSie sollten zuerst überlegen, ob das nachfolgende Leerzeichen beabsichtigt ist. Viele Projekte, darunter der Linux-Kernel, Mozilla, Drupal und Kerberos (um nur einige auf der Wikipedia-Seite zum Thema Stil zu nennen), verbieten das Nachstellen von Leerzeichen. Aus der Linux-Kerneldokumentation:
In Ihrem Fall ist das Problem umgekehrt: Frühere Commits (und möglicherweise aktuelle) haben diese Richtlinie nicht befolgt.
Ich würde wetten, dass niemand wirklich das nachgestellte Leerzeichen will, und die Behebung des Problems könnte eine willkommene Änderung sein. Bei anderen Benutzern tritt möglicherweise das gleiche Problem auf wie bei Ihnen. Es ist auch wahrscheinlich, dass die Mitwirkenden, die nachgestellte Leerzeichen hinzufügen, nicht wissen, dass sie dies tun.
Anstatt zu versuchen, git neu zu konfigurieren, um das Problem zu ignorieren, oder die ansonsten wünschenswerte Funktionalität in Ihrem Editor zu deaktivieren, würde ich mit einem Beitrag auf der Projekt-Mailingliste beginnen, in dem das Problem erläutert wird. Viele Editoren (und Git selbst) können so konfiguriert werden, dass sie mit nachgestellten Leerzeichen umgehen.
quelle
Ich habe einen Git- Pre-Commit-Hook gefunden, der nachgestellte Leerzeichen entfernt . Wenn Sie jedoch andere nicht dazu bringen können, dies zu verwenden, ist dies möglicherweise keine gültige Lösung.
quelle