Vous pouvez inciter Git à réparer les espaces blancs pour vous, en incitant Git à traiter vos modifications comme un patch. Contrairement aux solutions de "crochet de pré-validation", ces solutions ajoutent des commandes de correction d'espaces à Git.
Oui, ce sont des hacks.
Solutions robustes
Les alias Git suivants sont extraits de
my~/.gitconfig
.
Par "robuste", je veux dire que ces alias s'exécutent sans erreur, faisant la bonne chose, que l'arborescence ou l'index soient sales. Cependant, ils ne fonctionnent pas si un interactif git rebase -i
est déjà en cours; voir mon~/.gitconfig
pour des vérifications supplémentaires si vous vous souciez de ce cas d'angle, où l' git add -e
astuce décrite à la fin devrait fonctionner.
Si vous souhaitez les exécuter directement dans le shell, sans créer d'alias Git, copiez et collez tout entre les guillemets doubles (en supposant que votre shell ressemble à Bash).
Correction de l'index mais pas de l'arbre
L' fixws
alias Git suivant corrige toutes les erreurs d'espaces dans l'index, le cas échéant, mais ne touche pas l'arborescence:
# 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"
L'idée est de s'exécuter git fixws
avant git commit
si vous avez des erreurs d'espaces dans l'index.
Correction de l'index et de l'arbre
L' fixws-global-tree-and-index
alias Git suivant corrige toutes les erreurs d'espaces dans l'index et l'arborescence, le cas échéant:
# 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"
Pour corriger également les espaces dans les fichiers non versionnés, procédez comme suit:
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Solutions simples mais pas robustes
Ces versions sont plus faciles à copier et coller, mais elles ne font pas la bonne chose si leurs conditions secondaires ne sont pas remplies.
Correction du sous-arbre enraciné dans le répertoire courant (mais réinitialise l'index s'il n'est pas vide)
Utiliser git add -e
pour "éditer" les patchs avec l'éditeur d'identité :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Correction et conservation de l'index (mais échoue si l'arborescence est sale ou l'index est vide)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Correction de l'arborescence et de l'index (mais réinitialise l'index s'il n'est pas vide)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Explication de l' export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
astuce
Avant d'apprendre l' git rebase --whitespace=fix
astuce de cette réponse, j'utilisais git add
partout l'astuce la plus compliquée .
Si nous l'avons fait manuellement:
Réglez apply.whitespace
sur fix
(vous ne devez le faire qu'une seule fois):
git config apply.whitespace fix
Cela indique à Git de corriger les espaces dans les correctifs .
Convaincre Git de traiter vos modifications comme un patch :
git add -up .
Appuyez sur a+ enterpour sélectionner toutes les modifications pour chaque fichier. Vous recevrez un avertissement vous informant que Git corrige vos erreurs d'espaces.
( git -c color.ui=auto diff
à ce stade, révèle que vos modifications non indexées sont exactement les erreurs d'espacement).
Supprimez les erreurs d'espacement de votre copie de travail:
git checkout .
Ramenez vos modifications (si vous n'êtes pas prêt à les valider):
git reset
Le GIT_EDITOR=:
moyen à utiliser en :
tant qu'éditeur et en tant que commande
:
est l'identité.