--- UPDATE 3 --- (nie koliduje z UPDATE 2)
Biorąc pod uwagę przypadek, w którym użytkownicy systemu Windows wolą pracować, CRLF
a użytkownicy systemu Linux / Mac wolą pracować nad LF
plikami tekstowymi. Udzielenie odpowiedzi z perspektywy opiekuna repozytorium :
Dla mnie najlepszą strategią (mniej problemów do rozwiązania) jest: zachowaj wszystkie pliki tekstowe z LF
wewnętrznym repozytorium git, nawet jeśli pracujesz nad projektem tylko dla systemu Windows. Następnie daj klientom swobodę pracy nad stylem końca preferencji , pod warunkiem, że wybiorą core.autocrlf
wartość właściwości, która będzie szanować twoją strategię (LF przy repo) podczas przemieszczania plików do zatwierdzenia.
Inscenizacja jest tym, co wiele osób myli, próbując zrozumieć, jak działają strategie nowej linii . Przed wybraniem właściwej wartości core.autocrlf
właściwości należy koniecznie zrozumieć następujące punkty :
- Dodanie pliku tekstowego dla commit ( wystawiając go) to jak kopiowanie pliku do innego miejsca wewnątrz
.git/
podkatalogu z przekonwertowane line-zakończeń (w zależności od core.autocrlf
wartości na swojej konfiguracji klienta). Wszystko to odbywa się lokalnie.
- ustawienie
core.autocrlf
jest jak udzielenie odpowiedzi na pytanie (dokładnie to samo pytanie na wszystkich systemach operacyjnych):
- „Czy git-client a. Konwertuje LF-na-CRLF podczas sprawdzania (wyciągania) zmian repo ze zdalnego lub b. Konwertuje CRLF-na-LF podczas dodawania pliku do zatwierdzenia? ” I możliwe odpowiedzi (wartości) są:
false:
„ nie rób nic z powyższych ”,
input:
„ Nie tylko b ”
true
: „ zrób aib ”
- zwróć uwagę, że NIE MA „ rób tylko ”
na szczęście
- Domyślne ustawienia klienta git (windows
core.autocrlf: true
:, linux / mac:)
core.autocrlf: false
będą zgodne ze strategią repo tylko LF .
Znaczenie : klienci Windows domyślnie przekonwertują na CRLF podczas sprawdzania repozytorium i konwertują na LF podczas dodawania do zatwierdzenia. Klienci Linuksa domyślnie nie wykonują żadnych konwersji. Teoretycznie zachowuje to tylko twoje repozytorium.
Niestety:
- Mogą istnieć klienci GUI, którzy nie przestrzegają
core.autocrlf
wartości git
- Mogą istnieć ludzie, którzy nie używają wartości, aby szanować twoją strategię repo. Np. Używają
core.autocrlf=false
i dodają plik z CRLF do zatwierdzenia.
Aby wykryć ASAP inne niż tekstowe pliki tekstowe zatwierdzone przez powyższych klientów , możesz postępować zgodnie z opisem w --- aktualizacja 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
, na kliencie skompilowanym przy użyciu: --with-libpcre
flag)
I tu jest haczyk: . Jako opiekun repo przechowuję plik, git.autocrlf=input
dzięki czemu mogę naprawić wszelkie nieprawidłowo popełnione pliki, dodając je ponownie w celu zatwierdzenia. I dostarczam tekst zatwierdzenia: „Naprawianie nieprawidłowo zatwierdzonych plików”.
O ile .gitattributes
jest to uzasadnione. Nie liczę na to, ponieważ jest więcej klientów interfejsu użytkownika, którzy tego nie rozumieją. Używam go tylko do udzielania wskazówek dla plików tekstowych i binarnych, a może oznaczam wyjątkowe pliki, które powinny wszędzie mieć te same zakończenia linii:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
Pytanie: Ale dlaczego w ogóle interesuje nas strategia obsługi nowego wiersza?
Odpowiedź: Aby uniknąć zatwierdzenia zmiany jednej litery, wyświetlaj się jako zmiana 5000-wierszowa , tylko dlatego, że klient, który dokonał zmiany, automatycznie przekonwertował pełny plik z crlf na lf (lub odwrotnie) przed dodaniem go do zatwierdzenia. Może to być dość bolesne, gdy w grę wchodzi rozwiązanie konfliktu . Lub może w niektórych przypadkach być przyczyną nierozsądnych konfliktów.
--- AKTUALIZACJA 2 ---
Awarie klienta git będą działać w większości przypadków. Nawet jeśli masz tylko klientów Windows, tylko Linux lub oba. To są:
- windows:
core.autocrlf=true
oznacza konwersję linii do CRLF przy kasie i konwersję linii do LF podczas dodawania plików.
- linux:
core.autocrlf=input
oznacza, że nie należy konwertować linii przy kasie (nie ma takiej potrzeby, ponieważ oczekuje się, że pliki zostaną zatwierdzone w LF) i konwertuj linie do LF (jeśli to konieczne) podczas dodawania plików. ( - update3 - : Wydaje się, że jest to false
domyślnie, ale znowu jest w porządku)
Właściwość można ustawić w różnych zakresach. Sugerowałbym wyraźne ustawienie --global
zakresu, aby uniknąć niektórych problemów IDE opisanych na końcu.
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
Również zdecydowanie odradzałbym używanie w systemie Windows git config --global core.autocrlf false
(jeśli masz tylko klientów Windows) w przeciwieństwie do tego, co proponuje się w dokumentacji git . Ustawienie wartości false spowoduje zatwierdzenie plików z CRLF w repozytorium. Ale tak naprawdę nie ma powodu. Nigdy nie wiadomo, czy będziesz musiał udostępnić projekt użytkownikom Linuksa. Dodatkowo jest to jeden dodatkowy krok dla każdego klienta, który dołącza do projektu zamiast korzystać z ustawień domyślnych.
Teraz w przypadku niektórych specjalnych przypadków plików (np. *.bat
*.sh
), Które chcesz, aby zostały wyewidencjonowane za pomocą LF lub CRLF, możesz użyć.gitattributes
Podsumowując, dla mnie najlepszą praktyką jest:
- Upewnij się, że każdy plik niebinarny jest zatwierdzony przez LF na git repo (zachowanie domyślne).
- Użyj tego polecenia, aby upewnić się, że żadne pliki nie są zatwierdzone za pomocą CRLF:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Uwaga: w systemach Windows klienci działają tylko przez, git-bash
a na klientach z systemem Linux tylko, jeśli są skompilowani przy użyciu --with-libpcre
in ./configure
).
- Jeśli znajdziesz takie pliki, wykonując powyższe polecenie, popraw je. Dotyczy to (przynajmniej na Linuksie):
- zestaw
core.autocrlf=input
( --- aktualizacja 3 - )
- zmień plik
- cofnij zmianę (plik jest nadal wyświetlany jako zmieniony)
- popełnij to
- Używaj tylko absolutnego minimum
.gitattributes
- Poinstruuj użytkowników, aby ustawili
core.autocrlf
wyżej opisane wartości domyślne.
- Nie licz 100% na obecność
.gitattributes
. git-klienci IDE mogą je ignorować lub traktować inaczej.
Jak już wspomniano, niektóre atrybuty git można dodać:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
Myślę, że istnieją inne bezpieczne opcje .gitattributes
zamiast używania automatycznego wykrywania plików binarnych:
-text
(np. dla plików *.zip
lub *.jpg
: nie będzie traktowany jak tekst. W związku z tym nie będą podejmowane próby konwersji na końcu linii. Różnice mogą być możliwe w programach do konwersji)
text !eol
(np *.java
, *.html
:.. Traktowana jako tekst, ale preferencji styl EOL nie jest tak ustawiony ustawienie klient jest używany)
-text -diff -merge
(np. dla *.hugefile
: Nie jest traktowany jako tekst. Brak możliwości porównania / scalenia)
--- POPRZEDNIA AKTUALIZACJA ---
Jeden bolesny przykład klienta, który nieprawidłowo zatwierdza pliki:
netbeans 8.2 (w systemie Windows), nieprawidłowo zatwierdza wszystkie pliki tekstowe z CRLF-ami, chyba że jawnie ustawisz core.autocrlf
jako globalny . Jest to sprzeczne ze standardowym zachowaniem klienta git i powoduje wiele problemów później, podczas aktualizacji / scalania. To sprawia, że niektóre pliki wyglądają inaczej (chociaż nie są) nawet po przywróceniu .
To samo zachowanie w netbeansie dzieje się, nawet jeśli poprawnie dodałeś .gitattributes
projekt.
Użycie następującego polecenia po zatwierdzeniu pomoże przynajmniej wcześnie wykryć, czy w repozytorium git występują problemy z zakończeniem linii: git grep -I --files-with-matches --perl-regexp '\r' HEAD
Spędziłem godziny, aby wymyślić jak najlepsze wykorzystanie .gitattributes
, aby w końcu uświadomić sobie, że nie mogę na to liczyć.
Niestety, dopóki istnieją edytory oparte na JGit (które nie mogą .gitattributes
poprawnie obsługiwać ), bezpiecznym rozwiązaniem jest wymuszanie LF wszędzie, nawet na poziomie edytora.
Użyj następujących anti-CRLF
środków dezynfekujących.
.gitattributes
?