Możesz oszukać Gita, aby naprawił dla Ciebie spację, oszukiwając Gita, by traktował twoje zmiany jako łatkę. W przeciwieństwie do rozwiązań „przechwytujących przed zatwierdzeniem”, rozwiązania te dodają polecenia Git do naprawiania białych znaków.
Tak, to są hacki.
Solidne rozwiązania
Poniższe aliasy Git pochodzą ode
mnie~/.gitconfig
.
Przez „solidny” rozumiem, że te aliasy są uruchamiane bezbłędnie, wykonując właściwe czynności, niezależnie od tego, czy drzewo lub indeks są brudne. Nie działają jednak, jeśli interaktywna git rebase -i
jest już w toku; zobacz moje~/.gitconfig
dodatkowe kontrole, jeśli zależy ci na tym rogu, w którym git add -e
trik opisany na końcu powinien zadziałać.
Jeśli chcesz uruchomić je bezpośrednio w powłoce, bez tworzenia aliasu Git, po prostu skopiuj i wklej wszystko między podwójnymi cudzysłowami (zakładając, że twoja powłoka jest podobna do Bash).
Napraw indeks, ale nie drzewo
Poniższy fixws
alias Git naprawia wszystkie błędy białych znaków w indeksie, jeśli występują, ale nie dotyka drzewa:
# 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"
Chodzi o to, aby uruchomić git fixws
wcześniej, git commit
jeśli w indeksie występują błędy białych znaków.
Napraw indeks i drzewo
Poniższy fixws-global-tree-and-index
alias Git naprawia wszystkie błędy białych znaków w indeksie i drzewie, jeśli występują:
# 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"
Aby również naprawić białe znaki w niewersjonowanych plikach, wykonaj:
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Proste, ale nie solidne rozwiązania
Te wersje są łatwiejsze do skopiowania i wklejenia, ale nie robią tego dobrze, jeśli ich warunki boczne nie są spełnione.
Napraw poddrzewa zakorzenione w bieżącym katalogu (ale resetuje indeks, jeśli nie jest pusty)
Używanie git add -e
do „edycji” poprawek za pomocą edytora tożsamości :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Napraw i zachowaj indeks (ale zawiedzie, jeśli drzewo jest brudne lub indeks jest pusty)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Napraw drzewo i indeks (ale resetuje indeks, jeśli nie jest pusty)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Wyjaśnienie export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
sztuczki
Zanim dowiedziałem się o git rebase --whitespace=fix
sztuczce z tej odpowiedzi,git add
wszędzie używałem bardziej skomplikowanej sztuczki.
Jeśli zrobiliśmy to ręcznie:
Ustawić apply.whitespace
na fix
(trzeba tylko to zrobić raz):
git config apply.whitespace fix
To każe Gitowi naprawić białe znaki w łatkach .
Przekonaj Gita, aby potraktował twoje zmiany jako łatkę :
git add -up .
Naciśnij a+, enteraby wybrać wszystkie zmiany dla każdego pliku. Otrzymasz ostrzeżenie o naprawianiu błędów spacji przez Git.
( git -c color.ui=auto diff
w tym momencie ujawnia, że twoje niezindeksowane zmiany są dokładnie błędami spacji).
Usuń błędy białych znaków z kopii roboczej:
git checkout .
Przywróć zmiany (jeśli nie jesteś gotowy, aby je zatwierdzić):
git reset
Te GIT_EDITOR=:
środki do wykorzystania :
jako redaktor, a jako polecenie
:
jest tożsamość.