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 -iProgramm ausgeführt wird. siehe meine~/.gitconfig für zusätzliche Kontrollen , wenn Sie diese Ecke Fall egal, wo der git add -eTrick 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 fixwsGit-Alias behebt alle Leerzeichenfehler im Index, berührt jedoch den Baum nicht:
# Logic:
#
# The 'git stash save' fails if the tree is clean (instead of
# creating an empty stash :P). So, we only 'stash' and 'pop' if
# the tree is dirty.
#
# The 'git rebase --whitespace=fix HEAD~' throws away the commit
# if it's empty, and adding '--keep-empty' prevents the whitespace
# from being fixed. So, we first check that the index is dirty.
#
# Also:
# - '(! git diff-index --quiet --cached HEAD)' is true (zero) if
# the index is dirty
# - '(! git diff-files --quiet .)' is true if the tree is dirty
#
# The 'rebase --whitespace=fix' trick is from here:
# https://stackoverflow.com/a/19156679/470844
fixws = !"\
if (! git diff-files --quiet .) && \
(! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git stash save FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~ && \
git stash pop && \
git reset --soft HEAD~ ; \
elif (! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git rebase --whitespace=fix HEAD~ && \
git reset --soft HEAD~ ; \
fi"
Die Idee ist, git fixwsvorher auszuführen, git commitwenn Sie Leerzeichenfehler im Index haben.
Korrigieren Sie den Index und den Baum
Der folgende fixws-global-tree-and-indexGit-Alias behebt alle Leerzeichenfehler im Index und im Baum, falls vorhanden:
# The different cases are:
# - dirty tree and dirty index
# - dirty tree and clean index
# - clean tree and dirty index
#
# We have to consider separate cases because the 'git rebase
# --whitespace=fix' is not compatible with empty commits (adding
# '--keep-empty' makes Git not fix the whitespace :P).
fixws-global-tree-and-index = !"\
if (! git diff-files --quiet .) && \
(! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git add -u :/ && \
git commit -m FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~2 && \
git reset HEAD~ && \
git reset --soft HEAD~ ; \
elif (! git diff-files --quiet .) ; then \
git add -u :/ && \
git commit -m FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~ && \
git reset HEAD~ ; \
elif (! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git rebase --whitespace=fix HEAD~ && \
git reset --soft HEAD~ ; \
fi"
Führen Sie folgende Schritte aus, um Leerzeichen in nicht versionierten Dateien zu korrigieren
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
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" ::
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Korrigieren und beibehalten Sie den Index (schlägt jedoch fehl, wenn der Baum verschmutzt oder der Index leer ist).
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Korrigieren Sie den Baum und den Index (setzt den Index jedoch zurück, wenn er nicht leer ist)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Erklärung des export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .Tricks
Bevor ich git rebase --whitespace=fixaus dieser Antwort etwas über den Trick erfuhr, benutzte ich git addüberall den komplizierteren Trick.
Wenn wir es manuell gemacht haben:
Setzen Sie apply.whitespaceauf fix(Sie dies nur einmal zu tun haben):
git config apply.whitespace fix
Dies weist Git an, Leerzeichen in Patches zu korrigieren .
Überzeugen Sie Git, Ihre Änderungen als Patch zu behandeln :
git add -up .
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 diffAn dieser Stelle wird angezeigt, dass Ihre nicht indizierten Änderungen genau die Leerzeichenfehler sind.)
Entfernen Sie die Leerzeichenfehler aus Ihrer Arbeitskopie:
git checkout .
Bringen Sie Ihre Änderungen zurück (wenn Sie nicht bereit sind, sie festzuschreiben):
git reset
Das GIT_EDITOR=:Mittel, das :als Editor und als Befehl verwendet werden soll,
:ist die Identität.