Ви можете обдурити Git, щоб виправити пробіл для вас, обманувши Git в трактуванні змін як виправлення. На відміну від рішень "попередньо здійснити гак", ці рішення додають команди Git для фіксації пробілів до 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=:засобі для використання в :якості редактора, і як команда
:є тотожним.