--- UPDATE 3 --- (nie koliduje z UPDATE 2)
Biorąc pod uwagę przypadek, w którym użytkownicy systemu Windows wolą pracować, CRLFa użytkownicy systemu Linux / Mac wolą pracować nad LFplikami tekstowymi. Udzielenie odpowiedzi z perspektywy opiekuna repozytorium :
Dla mnie najlepszą strategią (mniej problemów do rozwiązania) jest: zachowaj wszystkie pliki tekstowe z LFwewnę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.autocrlfwartość 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.autocrlfwł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.autocrlfwartości na swojej konfiguracji klienta). Wszystko to odbywa się lokalnie.
- ustawienie
core.autocrlfjest 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: falsebę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.autocrlfwartości git
- Mogą istnieć ludzie, którzy nie używają wartości, aby szanować twoją strategię repo. Np. Używają
core.autocrlf=falsei 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-libpcreflag)
I tu jest haczyk: . Jako opiekun repo przechowuję plik, git.autocrlf=inputdzię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 .gitattributesjest 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 falsedomyślnie, ale znowu jest w porządku)
Właściwość można ustawić w różnych zakresach. Sugerowałbym wyraźne ustawienie --globalzakresu, 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-basha na klientach z systemem Linux tylko, jeśli są skompilowani przy użyciu --with-libpcrein ./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.autocrlfwyż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 .gitattributeszamiast używania automatycznego wykrywania plików binarnych:
-text(np. dla plików *.ziplub *.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.autocrlfjako 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ś .gitattributesprojekt.
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ą .gitattributespoprawnie 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?