Puedes engañar a Git para que arregle el espacio en blanco por ti, engañando a Git para que trate tus cambios como un parche. En contraste con las soluciones de "enlace previo al compromiso", estas soluciones agregan comandos de fijación de espacios en blanco a Git.
Sí, estos son hacks.
Soluciones robustas
Los siguientes alias de Git están tomados de
mi~/.gitconfig
.
Por "robusto" quiero decir que estos alias se ejecutan sin error, haciendo lo correcto, independientemente de si el árbol o el índice están sucios. Sin embargo, no funcionan si un interactivo git rebase -i
ya está en progreso; vea mi~/.gitconfig
para verificaciones adicionales si le importa este caso de esquina, donde el git add -e
truco descrito al final debería funcionar.
Si desea ejecutarlos directamente en el shell, sin crear un alias Git, simplemente copie y pegue todo entre las comillas dobles (suponiendo que su shell sea Bash).
Arregla el índice pero no el árbol
El siguiente fixws
alias de Git corrige todos los errores de espacios en blanco en el índice, si los hay, pero no toca el árbol:
# 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"
La idea es correr git fixws
antes git commit
si tiene errores de espacio en blanco en el índice.
Repara el índice y el árbol
El siguiente fixws-global-tree-and-index
alias de Git corrige todos los errores de espacios en blanco en el índice y el árbol, si corresponde:
# 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"
Para corregir también los espacios en blanco en archivos no versionados, haga
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Soluciones simples pero no robustas
Estas versiones son más fáciles de copiar y pegar, pero no hacen lo correcto si no se cumplen sus condiciones secundarias.
Repara el subárbol enraizado en el directorio actual (pero restablece el índice si no está vacío)
Utilizando git add -e
para "editar" los parches con el editor de identidad :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Repara y preserva el índice (pero falla si el árbol está sucio o el índice está vacío)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Repara el árbol y el índice (pero restablece el índice si no está vacío)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Explicación del export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
truco.
Antes de conocer el git rebase --whitespace=fix
truco de esta respuesta , estaba usando el git add
truco más complicado en todas partes.
Si lo hicimos manualmente:
Establezca apply.whitespace
en fix
(solo tiene que hacer esto una vez):
git config apply.whitespace fix
Esto le dice a Git que arregle espacios en blanco en parches .
Convence a Git para tratar tus cambios como un parche :
git add -up .
Presione a+ enterpara seleccionar todos los cambios para cada archivo. Recibirás una advertencia sobre Git arreglando tus errores de espacio en blanco.
( git -c color.ui=auto diff
en este punto revela que sus cambios no indexados son exactamente los errores de espacio en blanco).
Elimine los errores de espacio en blanco de su copia de trabajo:
git checkout .
Recupere sus cambios (si no está listo para confirmarlos):
git reset
El GIT_EDITOR=:
medio para usar :
como editor y como comando
:
es la identidad.