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 der git 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:
# 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 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:
# 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=fix
aus dieser Antwort etwas über den Trick erfuhr, benutzte ich git add
überall den komplizierteren Trick.
Wenn wir es manuell gemacht haben:
Setzen Sie apply.whitespace
auf 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 diff
An 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.