Vous pouvez tromper Git dans la fixation de l'espace pour vous, en incitant Git dans le traitement de vos modifications en tant que patch. Contrairement à la "pre-commit hook" des solutions, ces solutions d'ajouter des espaces de fixation des commandes Git.
Oui, ce sont des hacks.
Des solutions robustes
La suite de Git alias sont prises à partir de
mon ~/.gitconfig.
Par "solide", je veux dire que ces alias exécuter sans erreur, en faisant
la bonne chose, peu importe si l'arbre ou de l'index sont sales.
Si vous souhaitez exécuter directement dans le shell, sans la création d'un Git
alias, il suffit de copier et coller tout ce qui est entre les guillemets
(en supposant que votre shell est Bash comme).
Fixer l'index, mais pas l'arbre
La suite de fixws
Git alias résout tous les espaces des erreurs dans l'index,
le cas échéant, mais ne pas toucher à l'arbre:
# 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:
# http://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 reset --soft HEAD~ && \
git stash pop ; \
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 lancer git fixws
avant git commit
si vous avez
les espaces des erreurs dans l'index.
Corrigé de l'indice et de l'arbre
La suite de fixws-global-tree-and-index
Git alias résout tous les espaces
des erreurs dans l'index et l'arbre, 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 fixer les espaces dans des fichiers non versionnés, ne
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Simple, mais pas des solutions robustes
Ces versions sont plus faciles à copier et coller, mais ils ne font pas le
bonne chose si de leur côté les conditions ne sont pas remplies.
Fixer le sous-arbre enraciné dans le répertoire courant (mais réinitialise l'index s'il n'est pas vide)
À l'aide de git add -e
"modifier" les patchs à l'identité de l'éditeur de :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Fixer et préserver l'index (mais échoue si l'arbre est sale ou si l'indice est vide)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Fixer l'arbre 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 que j'ai appris à propos de l' git rebase --whitespace=fix
truc de cette réponse , j'ai été en utilisant le plus compliqué git add
astuce partout.
Si nous avons fait manuellement:
-
Ensemble apply.whitespace
de fix
(vous n'avez qu'à le faire une seule fois):
git config apply.whitespace fix
Cela indique à Git pour fixer les espaces dans les patchs.
-
Convaincre Git pour traiter vos modifications en tant que patch:
git add -up .
Frapper un+enterpour sélectionner tous les changements pour chaque fichier. Vous obtiendrez un avertissement sur Git la fixation de votre espace erreurs.
(git -c color.ui=auto diff
à ce point révèle que votre non-indexé changements sont exactement les espaces d'erreurs).
-
Supprimer les espaces les erreurs de votre copie de travail:
git checkout .
-
Apportez vos modifications (si vous n'êtes pas prêt à s'engager eux):
git reset
L' GIT_EDITOR=:
des moyens de les utiliser :
comme l'éditeur, et comme une commande
:
est l'identité.