Вы можете обмануть Git, чтобы исправить пробелы, обманывая Git, рассматривая ваши изменения как патч. В отличие от решений «pre-commit hook», эти решения добавляют в Git команды исправления пробелов.
Да, это хаки.
Надежные решения
Следующие псевдонимы Git взяты из
мой ~/.gitconfig
.
Под "устойчивым" я подразумеваю, что эти псевдонимы работают без ошибок, делая
правильная вещь, независимо от того, являются ли дерево или индекс грязными. Однако они не работают, если интерактивный git rebase -i
уже выполняется; см. my ~/.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 alias исправляет все пробелы
ошибки в индексе и дереве, если есть:
# 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 + , введите , чтобы выбрать все изменения для каждого файла. Вы получите предупреждение о том, что Git исправляет ваши пробельные ошибки.
(git -c color.ui=auto diff
в этот момент показывает, что ваши неиндексированные изменения являются именно ошибками пробелов).
Удалите ошибки пробелов из вашей рабочей копии:
git checkout .
Верните ваши изменения (если вы не готовы их зафиксировать):
git reset
GIT_EDITOR=:
означает использовать :
в качестве редактора и в качестве команды
:
это личность.