Вы можете обмануть Git, чтобы исправить пробелы для вас, обманув Git, рассматривая ваши изменения как патч. В отличие от решений «pre-commit hook», эти решения добавляют в Git команды исправления пробелов.
Да, это хаки.
Надежные решения
Следующие псевдонимы Git взяты из
моего~/.gitconfig
.
Под «устойчивым» я подразумеваю, что эти псевдонимы работают без ошибок, делая правильные вещи, независимо от того, являются ли дерево или индекс грязными. Тем не менее, они не работают, если интерактив git rebase -i
уже выполняется; см. мои~/.gitconfig
дополнительные проверки, если вам небезразличен этот угловой случай, где git add -e
описанный в конце прием должен работать.
Если вы хотите запустить их непосредственно в оболочке, не создавая псевдоним Git, просто скопируйте и вставьте все в двойные кавычки (при условии, что ваша оболочка похожа на Bash).
Исправить индекс, но не дерево
Следующий fixws
псевдоним Git исправляет все пробельные ошибки в индексе, если таковые имеются, но не затрагивает дерево:
# 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"
Идея состоит в том, чтобы запускаться git fixws
раньше, git commit
если у вас есть ошибки пробела в индексе.
Исправить индекс и дерево
Следующий fixws-global-tree-and-index
псевдоним Git исправляет все ошибки пробелов в индексе и дереве, если они есть:
# 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"
Чтобы также исправить пробелы в неверсионных файлах, выполните
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Простые, но не надежные решения
Эти версии легче копировать и вставлять, но они не делают правильных вещей, если их побочные условия не выполняются.
Исправьте поддерево с корнем в текущем каталоге (но сбрасывает индекс, если он не пустой)
Использование git add -e
для «редактирования» патчей с помощью редактора идентичности :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Исправить и сохранить индекс (но не работает, если дерево грязное или индекс пустой)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Исправьте дерево и индекс (но сбрасывает индекс, если он не пустой)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Объяснение export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
уловки
Прежде чем я узнал об git rebase --whitespace=fix
уловке из этого ответа, я использовал более сложную git add
уловку везде.
Если мы сделали это вручную:
Установите apply.whitespace
в fix
(вы должны сделать это только один раз):
git config apply.whitespace fix
Это говорит Git исправлять пробелы в патчах .
Убедите Git рассматривать ваши изменения как патч :
git add -up .
Нажмите a+, enterчтобы выбрать все изменения для каждого файла. Вы получите предупреждение о том, что Git исправляет ваши пробельные ошибки.
( git -c color.ui=auto diff
в этот момент обнаруживается, что ваши неиндексированные изменения являются именно ошибками пробелов).
Удалите ошибки пробелов из вашей рабочей копии:
git checkout .
Верните ваши изменения (если вы не готовы их зафиксировать):
git reset
В GIT_EDITOR=:
средстве для использования в :
качестве редактора, и как команда
:
является тождественным.