Puoi ingannare Git nel fissare lo spazio bianco per te, ingannando Git nel trattare le tue modifiche come una patch. Contrariamente alle soluzioni "hook pre-commit", queste soluzioni aggiungono comandi Git per il fissaggio degli spazi bianchi.
Sì, questi sono hack.
Soluzioni robuste
I seguenti alias Git sono presi dal
mio~/.gitconfig
.
Per "robusto" intendo che questi alias funzionano senza errori, facendo la cosa giusta, indipendentemente dal fatto che l'albero o l'indice siano sporchi. Tuttavia, non funzionano se git rebase -i
è già in corso un interattivo ; consultare my~/.gitconfig
per ulteriori controlli se ti interessa questo caso d'angolo, in cui il git add -e
trucco descritto alla fine dovrebbe funzionare.
Se vuoi eseguirli direttamente nella shell, senza creare un alias Git, copia e incolla tutto tra le doppie virgolette (supponendo che la tua shell sia simile a Bash).
Correggi l'indice ma non l'albero
Il seguente fixws
alias Git corregge tutti gli errori degli spazi bianchi nell'indice, se presenti, ma non tocca l'albero:
# 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'idea è di eseguire git fixws
prima git commit
se si verificano errori di spazio nell'indice.
Correggi l'indice e l'albero
Il seguente fixws-global-tree-and-index
alias Git corregge tutti gli errori degli spazi bianchi nell'indice e nella struttura, se presenti:
# 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"
Per correggere anche gli spazi bianchi nei file senza versione, fare
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Soluzioni semplici ma non robuste
Queste versioni sono più facili da copiare e incollare, ma non fanno la cosa giusta se le loro condizioni secondarie non sono soddisfatte.
Correggi il sottoalbero radicato nella directory corrente (ma reimposta l'indice se non è vuoto)
Usando git add -e
per "modificare" le patch con l'editor delle identità :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Correggi e conserva l'indice (ma non riesce se l'albero è sporco o l'indice è vuoto)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Correggi l'albero e l'indice (ma reimposta l'indice se non è vuoto)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Spiegazione del export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
trucco
Prima di apprendere il git rebase --whitespace=fix
trucco da questa risposta, stavo usando il git add
trucco più complicato ovunque.
Se lo facessimo manualmente:
Impostare apply.whitespace
su fix
(devi farlo solo una volta):
git config apply.whitespace fix
Questo dice a Git di correggere gli spazi bianchi nelle patch .
Convinci Git a trattare le tue modifiche come una patch :
git add -up .
Premi a+ enterper selezionare tutte le modifiche per ciascun file. Riceverai un avviso su Git che risolve i tuoi errori di spazio bianco.
( git -c color.ui=auto diff
a questo punto rivela che le modifiche non indicizzate sono esattamente gli errori degli spazi bianchi).
Rimuovi gli errori degli spazi bianchi dalla tua copia di lavoro:
git checkout .
Ripristina le modifiche (se non sei pronto a impegnarle):
git reset
Il GIT_EDITOR=:
mezzo da utilizzare :
come editor e come comando
:
è l'identità.