Ви можете обдурити 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=:
засобі для використання в :
якості редактора, і як команда
:
є тотожним.