Você pode induzir o Git a corrigir o espaço em branco para você, enganando o Git a tratar suas alterações como um patch. Ao contrário das soluções "gancho de pré-confirmação", essas soluções adicionam comandos de correção de espaço em branco ao Git.
Sim, estes são hacks.
Soluções robustas
Os seguintes aliases do Git são retirados do
meu~/.gitconfig
.
Por "robusto", quero dizer que esses aliases são executados sem erros, fazendo a coisa certa, independentemente de a árvore ou o índice estarem sujos. No entanto, eles não funcionam se uma interativa git rebase -i
já estiver em andamento; consulte o meu~/.gitconfig
para verificações adicionais se você se importa com este caso de canto, onde o git add -e
truque descrito no final deve funcionar.
Se você deseja executá-los diretamente no shell, sem criar um alias do Git, basta copiar e colar tudo entre aspas duplas (assumindo que o seu shell seja do tipo Bash).
Corrija o índice, mas não a árvore
O seguinte fixws
alias do Git corrige todos os erros de espaço em branco no índice, se houver, mas não toca na árvore:
# 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"
A ideia é executar git fixws
antes git commit
se houver erros de espaço em branco no índice.
Corrija o índice e a árvore
O fixws-global-tree-and-index
alias do Git a seguir corrige todos os erros de espaço em branco no índice e na árvore, se houver:
# 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 também corrigir espaços em branco em arquivos não versionados, faça
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Soluções simples, mas não robustas
Essas versões são mais fáceis de copiar e colar, mas não fazem a coisa certa se suas condições colaterais não forem atendidas.
Corrija a subárvore com raiz no diretório atual (mas redefina o índice se não estiver vazio)
Usando git add -e
para "editar" os patches com o editor de identidade :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Corrija e preserve o índice (mas falhará se a árvore estiver suja ou o índice estiver vazio)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Corrija a árvore e o índice (mas redefine o índice se não estiver vazio)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Explicação do export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
truque
Antes de aprender sobre o git rebase --whitespace=fix
truque desta resposta, eu estava usando o git add
truque mais complicado em todos os lugares.
Se o fizermos manualmente:
Defina apply.whitespace
como fix
(você só precisa fazer isso uma vez):
git config apply.whitespace fix
Isso diz ao Git para corrigir espaços em branco nos patches .
Convença o Git a tratar suas alterações como um patch :
git add -up .
Pressione a+ enterpara selecionar todas as alterações para cada arquivo. Você receberá um aviso sobre o Git corrigindo os erros de espaço em branco.
( git -c color.ui=auto diff
neste momento, revela que suas alterações não indexadas são exatamente os erros de espaço em branco).
Remova os erros de espaço em branco da sua cópia de trabalho:
git checkout .
Traga de volta suas alterações (se você não estiver pronto para confirmá-las):
git reset
O GIT_EDITOR=:
meio de usar :
como editor e como comando
:
é a identidade.