Ich verwende git mit meinem Team und möchte Leerzeichenänderungen aus meinen Diffs, Protokollen, Zusammenführungen usw. entfernen. Ich gehe davon aus, dass der einfachste Weg, dies zu tun, darin besteht, dass git nachfolgendes Leerzeichen (und andere Leerzeichenfehler) automatisch entfernt ) von allen Commits, wie sie angewendet werden.
Ich habe versucht, Folgendes per ~/.gitconfig
Datei hinzuzufügen, aber es macht nichts, wenn ich festschreibe. Vielleicht ist es für etwas anderes konzipiert. Was ist die Lösung?
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
Ich benutze Ruby, falls jemand irgendwelche rubinspezifischen Ideen hat. Die automatische Code-Formatierung vor dem Festschreiben wäre der nächste Schritt, aber das ist ein schwieriges Problem und verursacht nicht wirklich ein großes Problem.
quelle
Antworten:
Diese Einstellungen (
core.whitespace
undapply.whitespace
) dienen nicht zum Entfernen von nachgestellten Leerzeichen, sondern zum:core.whitespace
: Erkennen Sie sie und lösen Sie Fehler ausapply.whitespace
: und entfernen Sie sie, aber nur während des Patches, nicht "immer automatisch"Ich glaube, das
git hook pre-commit
würde einen besseren Job machen (einschließlich des Entfernens von nachgestellten Leerzeichen).Beachten Sie, dass Sie jederzeit festlegen können, dass der
pre-commit
Hook nicht ausgeführt werden soll :git commit --no-verify .
cd .git/hooks/ ; chmod -x pre-commit
Warnung: Standardmäßig verfügt ein
pre-commit
Skript (wie dieses ) nicht über die Funktion "Nachlauf entfernen", sondern über die Funktion "Warnung" wie:Sie könnten jedoch einen besseren
pre-commit
Haken bauen , insbesondere wenn Sie Folgendes berücksichtigen:Zum Beispiel schlägt Oldman in einer anderen Antwort einen
pre-commit
Haken vor , der Leerzeichen erkennt und entfernt.Da dieser Hook den Dateinamen jeder Datei erhält, würde ich empfehlen, bei bestimmten Dateitypen vorsichtig zu sein: Sie möchten keine nachgestellten Leerzeichen in
.md
(Markdown-) Dateien entfernen !quelle
apply.whitespace
korrigieren, indem git dazu gebracht wird, Ihre Änderungen an der Arbeitskopie als Patch zu behandeln. Siehe meine Antwort unten ..editorconfig
Dateien eine bestimmte Regel dafür haben.<br>
core.whitespace
auftrailing-space
withgit config
löst beimgit
Festschreiben in 2.5.0 keinen Fehler aus.Sie können Git dazu verleiten, das Leerzeichen für Sie zu korrigieren, indem Sie Git dazu verleiten, Ihre Änderungen als Patch zu behandeln. Im Gegensatz zu den "Pre-Commit-Hook" -Lösungen fügen diese Lösungen Git Whitespace-Fixing-Befehle hinzu.
Ja, das sind Hacks.
Robuste Lösungen
Die folgenden Git-Aliase stammen von my
~/.gitconfig
.Mit "robust" meine ich, dass diese Aliase fehlerfrei ausgeführt werden und das Richtige tun, unabhängig davon, ob der Baum oder der Index verschmutzt sind. Sie funktionieren jedoch nicht, wenn bereits ein interaktives
git rebase -i
Programm ausgeführt wird. siehe meine~/.gitconfig
für zusätzliche Kontrollen , wenn Sie diese Ecke Fall egal, wo dergit add -e
Trick am Ende beschrieben funktionieren soll.Wenn Sie sie direkt in der Shell ausführen möchten, ohne einen Git-Alias zu erstellen, kopieren Sie einfach alles und fügen Sie es zwischen die doppelten Anführungszeichen ein (vorausgesetzt, Ihre Shell ist Bash-ähnlich).
Korrigieren Sie den Index, aber nicht den Baum
Der folgende
fixws
Git-Alias behebt alle Leerzeichenfehler im Index, berührt jedoch den Baum nicht:Die Idee ist,
git fixws
vorher auszuführen,git commit
wenn Sie Leerzeichenfehler im Index haben.Korrigieren Sie den Index und den Baum
Der folgende
fixws-global-tree-and-index
Git-Alias behebt alle Leerzeichenfehler im Index und im Baum, falls vorhanden:Führen Sie folgende Schritte aus, um Leerzeichen in nicht versionierten Dateien zu korrigieren
Einfache, aber nicht robuste Lösungen
Diese Versionen sind einfacher zu kopieren und einzufügen, aber sie tun nicht das Richtige, wenn ihre Nebenbedingungen nicht erfüllt sind.
Korrigieren Sie den im aktuellen Verzeichnis verwurzelten Unterbaum (setzt den Index jedoch zurück, wenn er nicht leer ist).
Verwenden Sie
git add -e
, um die Patches mit dem Identitätseditor zu "bearbeiten":
:Korrigieren und beibehalten Sie den Index (schlägt jedoch fehl, wenn der Baum verschmutzt oder der Index leer ist).
Korrigieren Sie den Baum und den Index (setzt den Index jedoch zurück, wenn er nicht leer ist)
Erklärung des
export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
TricksBevor ich
git rebase --whitespace=fix
aus dieser Antwort etwas über den Trick erfuhr, benutzte ichgit add
überall den komplizierteren Trick.Wenn wir es manuell gemacht haben:
Setzen Sie
apply.whitespace
auffix
(Sie dies nur einmal zu tun haben):Dies weist Git an, Leerzeichen in Patches zu korrigieren .
Überzeugen Sie Git, Ihre Änderungen als Patch zu behandeln :
Drücken Sie a+ enter, um alle Änderungen für jede Datei auszuwählen. Sie erhalten eine Warnung, dass Git Ihre Leerzeichenfehler behebt.
(
git -c color.ui=auto diff
An dieser Stelle wird angezeigt, dass Ihre nicht indizierten Änderungen genau die Leerzeichenfehler sind.)Entfernen Sie die Leerzeichenfehler aus Ihrer Arbeitskopie:
Bringen Sie Ihre Änderungen zurück (wenn Sie nicht bereit sind, sie festzuschreiben):
Das
GIT_EDITOR=:
Mittel, das:
als Editor und als Befehl verwendet werden soll,:
ist die Identität.quelle
set VISUAL= && git add -ue . && git checkout .
Beachten Sie das '.
' verwendet mitgit add
: das liegt an git1.8.3git commit
, dass der falsche Editor später verwendet wird? Ich verpacke dasVISUAL=
Teil in einer Subshell in meiner Unix-Version oben, um dies zu vermeiden, aber ich weiß nicht, ob DOS Subshells hat.core.editor
, hat der ExportVISUAL
keine Auswirkung, da die Konfigurationseinstellung Vorrang hatman git-var
. Um dies zu überschreiben, müssen SieGIT_EDITOR=:
stattdessen exportieren .fixws
angepasst, dass sie schnell fehlschlägt, wenn Sie sich bereits in einer interaktiven Rebase befinden, da sie sonst an dergit rebase --whitespace=fix
Leitung stirbt und Sie in einem seltsamen Zustand zurücklässt . Ich habe mir diese Frage geliehen und gerade einen zusätzlichen Fall vor dem if hinzugefügt:fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
Ich habe einen Git- Pre-Commit-Hook gefunden, der nachgestellte Leerzeichen entfernt .
quelle
sed
Aufruf (sed -r 's/:[0-9]+:.*//'
) könnte durch ersetzt werdencut -f1 -d:
. Dies sollte sowohl auf Linux- als auch auf BSD-basierten Plattformen gleich funktionieren.cut
nicht so sicher wie die zweitesed
: Der Schnitt schlägt im (höchst unwahrscheinlichen) Fall von Dateinamen fehl, die ":" enthalten. Sie könntenawk 'NF>2{NF-=2}1'
sicher seincore.autocrlf=true
, möchten Sie möglicherweisedos2unix -D "$FILE"
nach sed innerhalb der for-Schleife hinzufügen . Andernfalls werden alle CRLFs in LFs geändert, indem nur sed ausgegeben wird.git add
in einem commit scheint ziemlich böse zu mir. Was ist, wenn Sie eine Datei teilweise bereitstellen / festschreiben? Sie möchten nicht, dass die gesamte Datei hinter Ihrem Rücken festgeschrieben wird, oder?Unter Mac OS (oder wahrscheinlich jedem BSD) müssen die sed-Befehlsparameter geringfügig abweichen. Versuche dies:
Speichern Sie diese Datei als
.git/hooks/pre-commit
- oder suchen Sie nach der Datei , die bereits vorhanden ist, und fügen Sie den unteren Block irgendwo darin ein. Und denkenchmod a+x
Sie auch daran.Oder für die globale Verwendung (über Git-Commit-Hooks - globale Einstellungen ) können Sie es in
$GIT_PREFIX/git-core/templates/hooks
(wobei GIT_PREFIX / usr oder / usr / local oder / usr / share oder / opt / local / share ist) einfügen undgit init
in Ihren vorhandenen Repos ausführen .Nach
git help init
:quelle
git hash-object -w
undgit update-index
(erneut) direkt in den Index einzufügen. Jemand sehr mutig.Ich überlasse diese Aufgabe lieber Ihrem Lieblingseditor.
Legen Sie einfach einen Befehl fest, um nachgestellte Leerzeichen beim Speichern zu entfernen.
quelle
(add-hook 'before-save-hook 'delete-trailing-whitespace)
zu Ihrer.emacs
Datei hinzufügen . Emacs Whitespace TricksVerwenden von Git-Attributen und Filter-Setup mit Git-Konfiguration
OK, dies ist ein neuer Ansatz zur Lösung dieses Problems. Mein Ansatz besteht darin, keine Hooks zu verwenden, sondern Filter und Git-Attribute zu verwenden. Auf diese Weise können Sie auf jedem Computer, auf dem Sie entwickeln, eine Reihe von Filtern einrichten, die zusätzliche nachgestellte Leerzeichen und zusätzliche Leerzeilen am Ende der Dateien entfernen, bevor Sie sie festschreiben. Richten Sie dann eine .gitattributes-Datei ein, die angibt, auf welche Dateitypen der Filter angewendet werden soll. Die Filter haben zwei Phasen,
clean
die beim Hinzufügen von Dateien zum Index undsmudge
beim Hinzufügen zum Arbeitsverzeichnis angewendet werden.Sagen Sie Ihrem Git, er soll nach einer globalen Attributdatei suchen
Weisen Sie zunächst Ihre globale Konfiguration an, eine globale Attributdatei zu verwenden:
Erstellen Sie globale Filter
Erstellen Sie nun den Filter:
Fügen Sie die sed scripting Magie hinzu
Fügen Sie das
fixup-eol-eof
Skript schließlich irgendwo in Ihren Pfad ein und machen Sie es ausführbar. Das Skript verwendet sed, um einige Änderungen im laufenden Betrieb vorzunehmen (Leerzeichen und Leerzeichen am Zeilenende und überflüssige Leerzeilen am Ende der Datei entfernen).fixup-eol-eof sollte folgendermaßen aussehen:
Mein Kern davon
Teilen Sie git mit, auf welche Dateitypen Ihr neu erstellter Filter angewendet werden soll
Zuletzt erstellen oder öffnen Sie ~ / .gitattributes_global in Ihrem bevorzugten Editor und fügen Sie Zeilen hinzu wie:
Wenn wir also das Whitespace-Problem beheben möchten, fügen wir für alle unsere c-Quelldateien eine Zeile hinzu, die folgendermaßen aussieht:
Diskussion des Filters
Der Filter besteht aus zwei Phasen: der Bereinigungsphase, die angewendet wird, wenn Dinge zum Index hinzugefügt oder eingecheckt werden, und der Verwischungsphase, wenn Git Dinge in Ihr Arbeitsverzeichnis legt. Hier führt unser Fleck nur den Inhalt durch den
cat
Befehl aus, wodurch er unverändert bleiben soll, mit der Ausnahme, dass möglicherweise ein nachfolgendes Zeilenumbruchzeichen hinzugefügt wird, wenn am Ende der Datei kein Zeichen vorhanden ist. Der Befehl clean ist die Whitespace-Filterung, die ich aus Notizen unter http://sed.sourceforge.net/sed1line.txt zusammengestellt habe . Es scheint, dass es in ein Shell-Skript eingefügt werden muss. Ich konnte nicht herausfinden, wie der Befehl sed eingefügt werden soll, einschließlich der Bereinigung der zusätzlichen Zeilen am Ende der Datei direkt in die git-config-Datei. (Sie CANEntfernen Sie nachgestellte Leerzeichen, ohne dass ein separates sed-Skript erforderlich ist. Setzen Sie das einfachfilter.fix-eol-eof
auf etwas,sed 's/[ \t]*$//' %f
bei dem\t
es sich um eine tatsächliche Registerkarte handelt, indem Sie die Tabulatortaste drücken.)Mit require = true wird ein Fehler ausgelöst, wenn etwas schief geht, damit Sie keine Probleme haben.
Bitte vergib mir, wenn meine Sprache in Bezug auf Git ungenau ist. Ich denke, ich habe ein ziemlich gutes Verständnis für die Konzepte, lerne aber immer noch die Terminologie.
quelle
.git
Ordner pro Ordner und nicht global konfiguriert werden können , was möglicherweise sinnvoller ist.Ich habe diesen Pre-Commit-Hook geschrieben, der nur den nachgestellten Leerraum aus den Zeilen entfernt, die Sie geändert / hinzugefügt haben, da die vorherigen Vorschläge dazu neigen, unlesbare Commits zu erstellen, wenn die Zieldateien zu viel nachgestellten Leerraum haben.
quelle
Bitte versuchen Sie es mit meinen Pre-Commit- Hooks . Sie können nachgestellte Leerzeichen automatisch erkennen und entfernen . Danke dir!
es kann funktionieren unter
GitBash(windows), Mac OS X and Linux
!Schnappschuss:
quelle
git commit -no-verify
irgendwelche Vorschläge gefunden?.md
Dateien zu erkennen und die Leerzeichen nicht zu entfernen, anstatt den Endbenutzer zu bitten, eine--no-verify
Option auf dem hinzuzufügengit commit
.+
-
Hier ist eine Ubuntu + Mac OS X-kompatible Version:
Habe Spaß
quelle
Ich habe heute darüber nachgedacht. Das ist alles, was ich für ein Java-Projekt getan habe:
quelle
Für Benutzer von Sublime Text .
Stellen Sie Folgendes in Ihrer Setting-User- Konfiguration richtig ein .
"trim_trailing_white_space_on_save": true
quelle
*.md
(Markdown-) Dateien, die zum Markieren einer einfachen Datei auf "" (nachfolgende doppelte Leerzeichen) angewiesen sind<br />
, und diese Einstellung scheint für alle Dateien zu gelten , einschließlich derjenigen, bei denen ich die nachfolgenden Leerzeichen nicht entfernen möchte.Die for-Schleife für Dateien verwendet die Shell-Variable $ IFS. In dem angegebenen Skript werden Dateinamen mit einem Zeichen, das sich ebenfalls in der Variablen $ IFS befindet, als zwei verschiedene Dateien in der for-Schleife angezeigt. Dieses Skript behebt das Problem: Der Multiline-Modus-Modifikator, wie er in sed-manual angegeben ist, scheint auf meiner Ubuntu-Box nicht standardmäßig zu funktionieren. Daher habe ich nach einer anderen Implementierung gesucht und diese mit einem iterierenden Label gefunden. Im Wesentlichen wird die Substitution nur auf der letzte Zeile der Datei, wenn ich es richtig verstanden habe.
[1] sed-subsition-Muster: Wie kann ich eine neue Zeile (\ n) durch sed ersetzen? .
quelle
Dies entfernt Leerzeichen vor einem Commit nicht automatisch , ist jedoch recht einfach durchzuführen. Ich habe das folgende Perl-Skript in eine Datei mit dem Namen git-wsf (git whitespace fix) in einem Verzeichnis in $ PATH eingefügt, damit ich Folgendes tun kann:
git wsf | Sch
und es entfernt alle Leerzeichen nur aus Dateizeilen, die git als Diff melden.
quelle
Etwas spät, aber da dies jemandem da draußen helfen könnte, geht es los.
Öffnen Sie die Datei in VIM. Geben Sie Folgendes in die vim-Befehlszeile ein, um Tabulatoren durch Leerzeichen zu ersetzen
Andere nachlaufende Leerzeichen loswerden
Das hat es so ziemlich für mich getan. Es ist mühsam, wenn Sie viele Dateien bearbeiten müssen. Aber ich fand es einfacher, als Hooks vorab festzuschreiben und mit mehreren Editoren zu arbeiten.
quelle
sed -i 's|\t| |g' filenames
(Leerzeichen in der Ersetzungsposition). Beachten Sie, dass Sie find verwenden können, um Ihre Dateinamen abzurufen. Wenn Sie nicht darüber nachgedacht haben, wie Sie dieses Backup erhalten können, schreibe ich normalerweise einfach alles fest und mache das Commit dann mit einem Soft-Reset wieder rückgängig. Manchmal füge ich alles zum Baum hinzu, aber schreibe nicht fest, und manchmal verwende ich den Stash / Apply (nicht Pop!). Wenn ich Angst habe, synchronisiere ich meinen gesamten Baum an einen sicheren Ort, bevor ich mich einmische ...Verwenden Sie Folgendes, um nachgestellte Leerzeichen am Zeilenende in einer Datei portabel zu löschen
ed
:quelle
Dies wird Ihr Problem wahrscheinlich nicht direkt lösen, aber Sie möchten diese möglicherweise über git-config in Ihrem tatsächlichen Projektbereich festlegen, der ./.git/config im Gegensatz zu ~ / .gitconfig bearbeitet. Schön, dass die Einstellungen unter allen Projektmitgliedern konsistent bleiben.
quelle