Dodaj następujące elementy do .gitconfig:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
Dzięki odpowiedzi @Colin Herbert za inspirację.
Wyjaśnienie składni
Końcowy #musi być cytowany, aby nie był traktowany jako komentarz wewnątrz .gitconfig, ale zamiast tego przechodzi i jest traktowany jako komentarz wewnątrz powłoki - jest wstawiany między końcem git applyargumentów dostarczonych przez użytkownika i gitautomatycznie umieszcza koniec wiersza poleceń. Te argumenty nie są tu potrzebne - nie chcemy git applyich konsumować, stąd poprzedzający znak komentarza. Możesz uruchomić to polecenie, GIT_TRACE=1 git anwaby zobaczyć, jak działa.
Te --sygnały końca argumentów i pozwala na razie, że masz plik o nazwie -wlub coś, co wygląda jak do przełącznika git diff.
W $@celu zachowania wszelkich argumentów cytowanych przez użytkownika wymagane są specjalne znaki cudzysłowu . Jeśli "postać nie ucieknie, zostanie pochłonięta przez .gitconfiganalizator składni i nie dotrze do powłoki.
Uwaga: .gitconfigalias parsowanie nie rozpoznaje apostrofy jako coś specjalnego - jego postacie są tylko specjalne ", \, \n, i ;(poza z "-quoted ciąg). Właśnie dlatego "należy zawsze uciekać, nawet jeśli wygląda na to, że znajduje się w ciągu pojedynczego cudzysłowu (którego git jest całkowicie agnostyczny).
Jest to ważne, np. jeśli masz przydatny alias do wykonania bashpolecenia w katalogu głównym drzewa roboczego. Niepoprawne sformułowanie to:
sh = !bash -c '"$@"' -
Prawidłowy to:
sh = !bash -c '\"$@\"' -
git apply --ignore-whitespacetej poprawki, ponieważ łatka nie miałaby zastosowania z oczywistych powodów.