Używam git z moim zespołem i chciałbym usunąć zmiany białych znaków z moich różnic, logów, scaleń itp. Zakładam, że najłatwiejszym sposobem na to byłoby git, aby automatycznie usunąć końcowe białe znaki (i inne błędy białych znaków) ) ze wszystkich zatwierdzeń po ich zastosowaniu.
Próbowałem dodać następujące do ~/.gitconfig
pliku, ale nic nie robi po zatwierdzeniu. Może jest przeznaczony do czegoś innego. Jakie jest rozwiązanie
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
Używam rubinu na wypadek, gdyby ktoś miał jakieś pomysły na ruby. Następnym krokiem byłoby automatyczne formatowanie kodu przed zatwierdzeniem, ale jest to trudny problem i tak naprawdę nie powoduje dużego problemu.
git
whitespace
githooks
mloughran
źródło
źródło
Odpowiedzi:
Te ustawienia (
core.whitespace
iapply.whitespace
) nie służą do usuwania końcowych białych znaków, ale do:core.whitespace
: wykryj je i zgłaszaj błędyapply.whitespace
: i usuń je, ale tylko podczas łatania, nie „zawsze automatycznie”Uważam,
git hook pre-commit
że lepiej by to zrobiło (obejmuje usunięcie spacji końcowych)Pamiętaj, że w dowolnym momencie możesz nie uruchamiać
pre-commit
haka:git commit --no-verify .
cd .git/hooks/ ; chmod -x pre-commit
Ostrzeżenie: domyślnie
pre-commit
skrypt (taki jak ten ) nie ma funkcji „usuń końcowy”, ale funkcję „ostrzegającą”, taką jak:Możesz jednak zbudować lepszy
pre-commit
hak , zwłaszcza jeśli weźmiesz pod uwagę, że:Na przykład, Oldman proponuje w innym odpowiedź na
pre-commit
hak , który wykrywa i usunąć spacje.Ponieważ ten haczyk pobiera nazwę każdego pliku, zalecam ostrożność w przypadku niektórych typów plików: nie chcesz usuwać końcowych białych znaków w
.md
plikach (przecena)!źródło
apply.whitespace
, nakłaniając git do traktowania zmian kopii roboczej jako łatki. Zobacz moją odpowiedź poniżej ..editorconfig
pliki mają określoną regułę.<br>
: github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…core.whitespace
natrailing-space
zgit config
nie powoduje błędu podczas zatwierdzania w wersjigit
2.5.0.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órymgit 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: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ą:Aby również naprawić białe znaki w niewersjonowanych plikach, wykonaj:
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:
:Napraw i zachowaj indeks (ale zawiedzie, jeśli drzewo jest brudne lub indeks jest pusty)
Napraw drzewo i indeks (ale resetuje indeks, jeśli nie jest pusty)
Wyjaśnienie
export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
sztuczkiZanim 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
nafix
(trzeba tylko to zrobić raz):To każe Gitowi naprawić białe znaki w łatkach .
Przekonaj Gita, aby potraktował twoje zmiany jako łatkę :
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:
Przywróć zmiany (jeśli nie jesteś gotowy, aby je zatwierdzić):
Te
GIT_EDITOR=:
środki do wykorzystania:
jako redaktor, a jako polecenie:
jest tożsamość.źródło
set VISUAL= && git add -ue . && git checkout .
Uwaga : „.
” używane zgit add
: to jest z powodu git1.8.3git commit
niewłaściwego edytora? Owinęłam tęVISUAL=
część w podpowłoce w mojej wersji unix powyżej, aby tego uniknąć, ale nie wiem, czy DOS ma podpowłoki.core.editor
ustawiłeś, eksportowanieVISUAL
nie ma żadnego efektu, ponieważ ustawienie konfiguracji ma pierwszeństwo dlaman git-var
. Aby to zmienić, musisz wyeksportowaćGIT_EDITOR=:
.fixws
by szybko się nie udawała, jeśli jesteś już w interaktywnej bazie, ponieważ w przeciwnym razie umrze nagit rebase --whitespace=fix
linii i pozostawi cię w dziwnym stanie. Pożyczałem od tego pytania i właśnie dodałem dodatkowy przypadek przed:fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
Znalazłem hak wstępnego zatwierdzenia git, który usuwa końcowe białe znaki .
źródło
sed
wywołanie (sed -r 's/:[0-9]+:.*//'
) można zastąpićcut -f1 -d:
. Powinno to działać tak samo na platformach Linux i BSD.cut
nie jest tak bezpieczne, jak drugiesed
: cięcie zakończy się niepowodzeniem w (bardzo mało prawdopodobnym) przypadku nazw plików zawierających „:”. Możeszawk 'NF>2{NF-=2}1'
być bezpiecznycore.autocrlf=true
, możesz chcieć dodaćdos2unix -D "$FILE"
wewnątrz pętli for, po sed. W przeciwnym razie zmieni wszystkie CRLF na LF, wydając tylko sed.git add
wewnątrz haka zatwierdzającego wydaje mi się dość złe. Co się stanie, jeśli wykonujesz częściowe przemieszczanie / zatwierdzanie pliku? Nie chcesz, aby cały plik został popełniony za twoimi plecami, prawda?W systemie Mac OS (lub prawdopodobnie w dowolnym BSD) parametry polecenia sed muszą się nieco różnić. Spróbuj tego:
Zapisz ten plik jako
.git/hooks/pre-commit
- lub poszukaj tego, który już tam jest, i wklej gdzieś w nim dolną porcję. I też o tym pamiętajchmod a+x
.Lub do użytku globalnego (poprzez haki zatwierdzania Git - ustawienia globalne ) możesz go umieścić
$GIT_PREFIX/git-core/templates/hooks
(gdzie GIT_PREFIX to / usr lub / usr / local lub / usr / share lub / opt / local / share) i uruchomićgit init
wewnątrz istniejących repozytoriów.Według
git help init
:źródło
git hash-object -w
igit update-index
(ponownego) wstawienia pliku munged bezpośrednio do indeksu. Ktoś bardzo odważny.Wolę pozostawić to zadanie twojemu ulubionemu redaktorowi.
Wystarczy ustawić polecenie, aby usunąć końcowe spacje podczas zapisywania.
źródło
(add-hook 'before-save-hook 'delete-trailing-whitespace)
do.emacs
pliku.Sztuczki emacsowe spacjamiKorzystanie z atrybutów git i konfiguracji filtrów z git config
OK, to nowy sposób na rozwiązanie tego problemu… Moje podejście polega na tym, aby nie używać żadnych haczyków, ale raczej używać filtrów i atrybutów git. Pozwala to na skonfigurowanie na każdym komputerze, na którym się rozwijasz, zestawu filtrów, które usuwają dodatkowe końcowe białe spacje i dodatkowe puste linie na końcu plików przed ich zatwierdzeniem. Następnie skonfiguruj plik .gitattributes, który określa typy plików, do których należy zastosować filtr. Filtry mają dwie fazy,
clean
które są stosowane podczas dodawania plików do indeksu ismudge
które są stosowane podczas dodawania ich do katalogu roboczego.Powiedz swojemu gitowi, aby szukał globalnego pliku atrybutów
Po pierwsze, powiedz swojej globalnej konfiguracji, aby używała globalnego pliku atrybutów:
Utwórz filtry globalne
Teraz utwórz filtr:
Dodaj magię skryptów sed
Na koniec umieść
fixup-eol-eof
skrypt gdzieś na swojej ścieżce i spraw, aby był wykonywalny. Skrypt używa sed do edycji w locie (usuwanie spacji i odstępów na końcu linii oraz obcych pustych linii na końcu pliku)fixup-eol-eof powinien wyglądać następująco:
moja istota tego
Powiedz git, do jakich typów plików zastosować nowo utworzony filtr
Na koniec utwórz lub otwórz ~ / .gitattributes_global w swoim ulubionym edytorze i dodaj linie takie jak:
Więc jeśli chcemy naprawić problem z białymi znakami, dla wszystkich naszych plików źródłowych c dodalibyśmy linię wyglądającą tak:
Dyskusja na temat filtra
Filtr ma dwie fazy, fazę czystą, która jest stosowana, gdy rzeczy są dodawane do indeksu lub rejestrowane, oraz fazę rozmazywania, gdy git umieszcza rzeczy w katalogu roboczym. W tym przypadku nasza rozmazanie po prostu uruchamia zawartość za pomocą
cat
polecenia, które powinno pozostawić je bez zmian, z wyjątkiem ewentualnego dodania końcowego znaku nowej linii, jeśli nie ma go na końcu pliku. Polecenie czyste to filtrowanie białych znaków, które zebrałem razem z notatek na stronie http://sed.sourceforge.net/sed1line.txt, spacji . Wygląda na to, że należy go umieścić w skrypcie powłoki, nie mogłem wymyślić, jak wstrzyknąć komendę sed, w tym oczyścić dodatkowe linie na końcu pliku bezpośrednio do pliku git-config. ( MOŻESZpozbyć się jednak spacji końcowych, bez potrzeby oddzielnego skryptu sed, po prostu ustaw opcjęfilter.fix-eol-eof
na coś,sed 's/[ \t]*$//' %f
gdzie\t
jest to prawdziwa karta, naciskając tab.)Wymagana = prawda powoduje, że błąd pojawia się, jeśli coś pójdzie nie tak, aby uniknąć kłopotów.
Proszę wybacz mi, jeśli mój język dotyczący git jest nieprecyzyjny. Myślę, że dość dobrze rozumiem pojęcia, ale wciąż uczę się terminologii.
źródło
.git
folderze, a nie globalnie, co może mieć większy sens.Napisałem ten haczyk przed zatwierdzeniem, który usuwa tylko końcowe białe znaki z linii, które zmieniłeś / dodałeś, ponieważ poprzednie sugestie mają tendencję do tworzenia nieczytelnych zatwierdzeń, jeśli pliki docelowe mają zbyt dużo końcowych białych znaków.
źródło
Spróbuj moich haków przed zatwierdzeniem , może automatycznie wykryć końcowe białe spacje i je usunąć . Dziękuję Ci!
może działać pod
GitBash(windows), Mac OS X and Linux
!Migawka:
źródło
git commit -no-verify
jakieś sugestie?.md
plik, a nie usuwać białe znaki, zamiast prosić użytkownika końcowego o dodanie--no-verify
opcji nagit commit
.+
lub-
Oto wersja kompatybilna z Ubuntu + Mac OS X:
baw się dobrze
źródło
Myślałem o tym dzisiaj. To wszystko, co skończyłem dla projektu Java:
źródło
Dla użytkowników Sublime Text .
Ustaw odpowiednio następujące ustawienia konfiguracji użytkownika .
"trim_trailing_white_space_on_save": true
źródło
*.md
pliki (przeceny), które polegają na „” (końcowe podwójne spacje) do oznaczania prostego<br />
, i to ustawienie wydaje się mieć zastosowanie do wszystkich plików, w tym tych, których nie chcę usuwać końcowych spacji.pętla for dla plików używa zmiennej powłoki $ IFS. w danym skrypcie nazwy plików ze znakiem, który również znajduje się w zmiennej $ IFS, będą widoczne jako dwa różne pliki w pętli for. Ten skrypt to naprawia: modyfikator trybu wielowierszowego, jak podano w instrukcji sed, nie wydaje się domyślnie działać na moim polu ubuntu, więc szukałem innej implementacji i znalazłem to z iterującą etykietą, w zasadzie zacznie on zastępować na ostatni wiersz pliku, jeśli dobrze go zrozumiałem.
[1] wzorzec subskrybcji: jak mogę zamienić znak nowej linii (\ n) za pomocą sed? .
źródło
To nie usuwa automatycznie białych znaków przed zatwierdzeniem, ale jest dość łatwe do wykonania. Umieszczam następujący skrypt perla w pliku o nazwie git-wsf (git whitespace fix) w katalogu w $ PATH, dzięki czemu mogę:
git wsf | sh
i usuwa wszystkie białe znaki tylko z linii plików, które git raporty jako różnicę.
źródło
Nieco późno, ale ponieważ może to komuś pomóc, oto jest.
Otwórz plik w VIM. Aby zamienić tabulatory na białe znaki, wpisz następujące polecenie w wierszu poleceń vim
Aby pozbyć się innych spacji końcowych
To prawie dla mnie to zrobiło. To nużące, jeśli masz wiele plików do edycji. Ale uznałem, że jest to łatwiejsze niż przechwytywanie z wyprzedzeniem i praca z wieloma edytorami.
źródło
sed -i 's|\t| |g' filenames
(spacje w pozycji zastępowania). Pamiętaj, że możesz użyć find, aby uzyskać nazwy plików. Jeśli nie zastanawiałeś się, jak uzyskać tę kopię zapasową, zwykle po prostu zatwierdzam wszystko, a następnie „cofam” zatwierdzenie miękkim resetowaniem z powrotem tam, gdzie jestem; czasami dodam wszystko do drzewa, ale nie zatwierdzam, a czasem używam skrytki / zastosowania (nie pop!). Jeśli czuję lęk, synchronizuję całe drzewo w bezpiecznym miejscu, zanim wtrącę się ...Aby przenośnie usunąć końcowe białe znaki na końcu wiersza w pliku, użyj
ed
:źródło
Prawdopodobnie nie rozwiąże to bezpośrednio twojego problemu, ale możesz chcieć ustawić je za pomocą git-config w twojej rzeczywistej przestrzeni projektu, która edytuje ./.git/config w przeciwieństwie do ~ / .gitconfig. Miło jest zachować spójność ustawień wśród wszystkich członków projektu.
źródło