Mam repozytorium git hostowane na github. Wiele plików zostało początkowo opracowanych w systemie Windows i nie byłem zbyt ostrożny z zakończeniami linii. Kiedy wykonywałem początkowe zatwierdzenie, nie miałem też żadnej konfiguracji git, która wymuszałaby poprawne zakończenia linii. Rezultat jest taki, że mam kilka plików z zakończeniami linii CRLF w moim repozytorium github.
Obecnie rozwijam się częściowo na Linuksie i chciałbym wyczyścić zakończenia linii. Jak mogę się upewnić, że pliki są poprawnie przechowywane w LF na github i że LF jest w mojej kopii roboczej?
Ustawiłem .gitattributes
plik zawierający text eol=LF
; czy to jest poprawne? Mając to zaangażowane i pchane, czy mogę po prostu rm
moje lokalne repozytorium i ponownie sklonować z github, aby uzyskać pożądany efekt?
Odpowiedzi:
Bez odrobiny informacji o tym, jakie pliki są w Twoim repozytorium (czysty kod źródłowy, obrazy, pliki wykonywalne, ...) trochę trudno odpowiedzieć na pytanie :)
Poza tym uznam, że chcesz domyślnie ustawić LF jako zakończenia linii w swoim katalogu roboczym, ponieważ chcesz się upewnić, że pliki tekstowe mają zakończenia linii LF w repozytorium .git, niezależnie od tego, czy pracujesz w systemie Windows czy Linux . Rzeczywiście, lepiej bezpiecznie niż żałować ....
Istnieje jednak lepsza alternatywa: skorzystaj z końcówek linii LF w swoim katalogu roboczym Linuksa, zakończeń linii CRLF w katalogu roboczym Windows ORAZ końców linii LF w repozytorium.
Ponieważ częściowo pracujesz w systemie Linux i Windows, upewnij się, że
core.eol
jest ustawiony nanative
icore.autocrlf
jest ustawiony natrue
.Następnie zamień zawartość pliku
.gitattributes
pliku na następującyPozwoli to Gitowi obsłużyć automatyczną konwersję zakończeń linii za Ciebie, przy zatwierdzeniach i zakupach. Pliki binarne nie zostaną zmienione, a pliki wykryte jako pliki tekstowe będą konwertowane na bieżąco.
Jednak znając zawartość swojego repozytorium, możesz pomóc Gitowi w wykryciu plików tekstowych z plików binarnych.
Pod warunkiem, że pracujesz nad projektem przetwarzania obrazu opartym na języku C, zastąp zawartość
.gitattributes
pliku następującymDzięki temu pliki z rozszerzeniem c, h lub txt będą przechowywane z zakończeniami linii LF w repozytorium i będą miały natywne zakończenia linii w katalogu roboczym. Pliki JPEG nie zostaną dotknięte. Wszystkie inne skorzystają na tym samym filtrowaniu automagicznym, jak pokazano powyżej.
Aby uzyskać głębsze zrozumienie wewnętrznych szczegółów tego wszystkiego, proponuję zagłębić się w ten bardzo dobry post „Mind the end of your line” autorstwa Tima Clema, Githubbera.
Jako przykład z prawdziwego świata możesz również zerknąć na to zatwierdzenie, w którym
.gitattributes
pokazane są te zmiany w pliku.UPDATE do odpowiedzi, biorąc pod uwagę następujący komentarz
Ma sens. Dziękuję za wyjaśnienie. W tym kontekście sam
.gitattributes
plik nie wystarczy.Uruchom następujące polecenia w swoim repozytorium
Ponieważ repozytorium jest współdzielone między środowiskiem Linux i Windows, zaktualizuje to lokalny plik konfiguracyjny dla obu środowisk.
core.eol
upewni się, że pliki tekstowe będą miały zakończenia linii LF w kasach.core.autocrlf
zapewni potencjał CRLF w plikach tekstowych (wynikające na przykład z operacji kopiuj / wklej) zostaną przekonwertowane na LF w twoim repozytorium.Opcjonalnie możesz pomóc Gitowi rozróżnić, co to jest plik tekstowy, tworząc
.gitattributes
plik zawierający coś podobnego do następującego:Jeśli zdecydowałeś się utworzyć
.gitattributes
plik, zatwierdź go .Na koniec upewnij się, że jest
git status
napisane „nic do zatwierdzenia (katalog roboczy czysty)” , a następnie wykonaj następującą operacjęSpowoduje to odtworzenie plików w katalogu roboczym, biorąc pod uwagę zmiany konfiguracji i rozszerzenie
.gitattributes
plik oraz zastąpienie ewentualnych przeoczonych CRLF w plikach tekstowych.Gdy to zrobisz, każdy plik tekstowy w katalogu roboczym BĘDZIE
git status
zawierał zakończenia linii LF i nadal powinien uważać katalog roboczy za czysty.źródło
vi
jest mniej zadowolony z CRLF. Czy chcę to zmienić, aby tocore.autocrlf
byłofalse
(lubinput
)?git checkout-index --force --all
może działać lepiej. Drugi punkt wydaje się nieco nie na temat, jeśli chodzi o pierwotne pytanie. Co powiesz na zadanie specjalnego pytania?text
ieol=lf
osiągnąć tego samego wyniku, jaki opisano w Twojej odpowiedzi za pomocącore.eol
icore.autocrlf
?git checkout-index --force --all
nic dla mnie nie robi. To, co działa, to lista poleceń w instrukcjach GitHub dotyczących radzenia sobie z tym problemem.Począwszy od git 2.10 (wydany 03.09.2016), nie jest konieczne osobne wyliczanie każdego pliku tekstowego. Git 2.10 naprawił zachowanie text = auto razem z eol = lf . Źródło .
.gitattributes
plik w katalogu głównym repozytorium git:Dodaj i zatwierdź.
Następnie możesz wykonać następujące czynności, a wszystkie pliki są teraz znormalizowane:
Źródło: odpowiedź kenorb .
źródło
Aby wymusić zakończenia linii LF dla wszystkich plików tekstowych, możesz utworzyć
.gitattributes
plik na najwyższym poziomie repozytorium z następującymi wierszami (zmień według potrzeb):co zapewnia, że wszystkie pliki, które Git uważa za pliki tekstowe, mają
LF
w repozytorium znormalizowane ( ) zakończenia wierszy (normalniecore.eol
konfiguracja kontroluje, który z nich masz domyślnie).Opierając się na nowych ustawieniach atrybutów, wszystkie pliki tekstowe zawierające CRLF powinny zostać znormalizowane przez Git. Jeśli nie stanie się to automatycznie, możesz odświeżyć repozytorium ręcznie po zmianie końców linii, dzięki czemu możesz ponownie przeskanować i zatwierdzić katalog roboczy, wykonując następujące kroki (mając czysty katalog roboczy):
lub zgodnie z dokumentacją GitHub :
Zobacz też: post @Charles Bailey .
Dodatkowo, jeśli chciałbyś wykluczyć jakiekolwiek pliki, które nie są traktowane jako tekst, odznacz ich atrybut tekstowy, np
Lub zaznacz to wyraźnie jako binarne:
Aby zobaczyć jakiś bardziej zaawansowany plik git normalizacji, sprawdź
.gitattributes
na Drupal rdzenia :Zobacz też:
źródło
text=auto
wprowadza w błąd. Nie możesz używaćtext=auto
ieol
razem. Ustawienieeol
wyłącza automatyczne wykrywanie plików tekstowych. Dlatego musisz określić wszystkie te typy plików. Gdybyauto
była włączona, nie potrzebowałbyś tego wszystkiego. 2. Nie potrzebujesztext
ieol=lf
.eol=lf
skutecznie ustawiatext
.* text=auto eol=lf
pierwszetext=auto
jest zastępowane przezeol=lf
. Gdzie znalazłeś tę funkcję? Oto moje źródło: stackoverflow.com/questions/29435156/ ...* text=auto eol=lf
z przykładu, ponieważ został również usunięty z Drupala. Rozważ również usunięcie komentarzy.