Mam edytor tekstu, który automatycznie przycina końcowe białe znaki po zapisaniu pliku, i uczestniczę w projekcie open source, który ma poważne problemy z końcowymi białymi znakami.
Za każdym razem, gdy próbuję przesłać poprawkę, najpierw muszę ręcznie zignorować wszystkie zmiany tylko w białych znakach, aby wybrać tylko odpowiednie informacje. Nie tylko to, ale kiedy biegam git rebase
, zwykle mam z tego powodu kilka problemów.
Jako taki chciałbym móc dodawać do indeksu tylko zmiany niebiałe, w podobny git add -p
sposób, ale bez konieczności wybierania wszystkich zmian osobiście.
Czy ktoś wie jak to zrobić?
EDYCJA: Nie mogę zmienić sposobu, w jaki działa projekt, i postanowili, po omówieniu go na liście mailingowej, zignorować to.
źródło
git apply --ignore-whitespace
tej poprawki, ponieważ łatka nie miałaby zastosowania z oczywistych powodów.git add -w
to zrobiło.patch does not apply
ierror while searching for
... Jakieś pomysły?patch does not apply
błąd.git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero
. Nie jest to ryzykowne, ponieważ indeks jest już tak aktualny, jak to tylko możliwe, dlatego jest wiarygodną bazą dla łatki.To działa dla mnie:
Jeśli chcesz zachować zapas, to działa
Nie lubię skrytek, ale natknąłem się na błąd w git + cygwin, w którym tracę zmiany, więc aby upewnić się, że rzeczy trafiły do dziennika, przynajmniej skonfigurowałem następujące ustawienia:
Zasadniczo tworzymy różnicę, która nie obejmuje zmian przestrzeni, cofamy wszystkie nasze zmiany, a następnie stosujemy różnicę.
źródło
git stash
zamiast kasowania, aby mieć kopię zapasową zmian, przynajmniej do czasu przetestowania.Utwórz plik łatki zawierający tylko rzeczywiste zmiany (z wyłączeniem linii z jedynie zmianami białych znaków), następnie wyczyść swój obszar roboczy i zastosuj ten plik łatki:
Przejrzyj pozostałe różnice, a następnie
add
icommit
jak zwykle.Odpowiednikiem Mercurial jest:
źródło
Odpowiedź najczęściej głosowana nie działa we wszystkich przypadkach, ze względu na spacje w kontekście łatki według użytkowników w komentarzach.
Zmodyfikowałem polecenie w następujący sposób:
To generuje łatkę bez kontekstu. Nie powinno to stanowić problemu, ponieważ łatka jest krótkotrwała.
Odpowiedni alias, ponownie wersja tego, co już udostępnili inni użytkownicy:
źródło
--ignore-space-change
zamiast tego użyć-w
.git diff -U0 --ignore-space-change --no-color | git apply --cached --unidiff-zero
--ignore-blank-lines
ponieważ w przeciwnym razie fragmenty różnic zostaną załatane przy nieprawidłowych przesunięciach, jeśli niektóre zmiany „białych znaków”, które chcesz zignorować, to usunięcie / dodanie pustych linii.Dodaj następujące elementy do
.gitconfig
: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ńcemgit apply
argumentów dostarczonych przez użytkownika igit
automatycznie umieszcza koniec wiersza poleceń. Te argumenty nie są tu potrzebne - nie chcemygit apply
ich konsumować, stąd poprzedzający znak komentarza. Możesz uruchomić to polecenie,GIT_TRACE=1 git anw
aby zobaczyć, jak działa.Te
--
sygnały końca argumentów i pozwala na razie, że masz plik o nazwie-w
lub coś, co wygląda jak do przełącznikagit 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.gitconfig
analizator składni i nie dotrze do powłoki.Uwaga:
.gitconfig
alias 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
bash
polecenia w katalogu głównym drzewa roboczego. Niepoprawne sformułowanie to:Prawidłowy to:
źródło
Co powiesz na następujące:
Polecenie w cudzysłowach pobiera nazwy plików, które mają zmiany spoza białych znaków.
źródło
git add `git diff -w |grep '^+++' |cut -c7-`
jeśli submoduły nie są używaneNależy najpierw rozważyć, czy końcowe białe znaki są zamierzone. Wiele projektów, w tym jądro Linuksa, Mozilla, Drupal i Kerberos (żeby wymienić tylko kilka ze strony Wikipedii na temat stylu) zabrania spacji. Z dokumentacji jądra Linux:
W twoim przypadku problem jest odwrotny: poprzednie zatwierdzenia (i być może obecne) nie były zgodne z tą wytyczną.
Założę się, że nikt tak naprawdę nie chce końcowej spacji, a naprawienie problemu może być mile widzianą zmianą. Inni użytkownicy mogą również doświadczać tego samego problemu. Możliwe jest również, że autorzy dodający końcowe białe znaki nie wiedzą, że to robią.
Zamiast próbować ponownie skonfigurować git, aby zignorować problem lub wyłączyć pożądaną w inny sposób funkcję edytora, zacznę od wpisu na liście mailingowej projektu wyjaśniającego problem. Wiele edytorów (i samego gita) można skonfigurować do obsługi białych znaków.
źródło
Znalazłem hak wstępnego zatwierdzenia git, który usuwa końcowe białe znaki . Jeśli jednak nie możesz zmusić innych do korzystania z tego, może to nie być prawidłowe rozwiązanie.
źródło