Chcę zmusić gita do pobierania plików w systemie Windows, używając po prostu LF
nie CR+LF
. Sprawdziłem dwie opcje konfiguracji, ale nie byłem w stanie znaleźć odpowiedniej kombinacji ustawień.
Chcę, aby przekonwertować wszystkie pliki LF
i zachować je LF
w plikach.
Uwaga: Użyłem, autocrlf = input
ale to tylko naprawia pliki, gdy je zatwierdzasz. Chcę go zmusić, aby ich używał LF
.
Prawdopodobnie nie byłem tak jasny: repozytorium już używa, LF
ale pliki wyewidencjonowane za pomocą msysgit używają CR+LF
i chcę zmusić msysgit do uzyskania LF
: wymuszania zakończenia linii uniksowych .
>git config --list | grep crlf
core.autocrlf=input
autocrlf=input
jest prawidłową opcją. Oczywiście nie chroni cię przed plikami, które naprawdę mającr+lf
w repozytorium lub tworzeniem plików za pomocącr+lf
innego narzędzia przed dodaniem ich do git. Jakie masz problemy, że to nie działa?LF
ale kiedy otrzymam je w systemie Windows, msysgit konwertuje je naCR+LF
.autocrlf
ustawieniu nainput
git pozostawialf
źródła linii w spokoju. Czy możesz opublikować wynikgit config
?Odpowiedzi:
OP dodał w swoim pytaniu:
Pierwszym prostym krokiem nadal byłby
.gitattributes
plik:(jak wspomniano w komentarzach przez wnuka , odnosząc się do
.gitattributes
End-of-line konwersji ), aby uniknąćCRLF
konwersję plików z poprawnaeol
.I zawsze zalecałem
git config --global core.autocrlf false
wyłączenie jakiejkolwiek konwersji (która miałaby zastosowanie do wszystkich wersjonowanych plików)Zobacz najlepsze praktyki dotyczące wieloplatformowej konfiguracji git?
Od wersji 2.16 Git (Q1 2018) możesz
git add --renormalize .
natychmiast zastosować te.gitattributes
ustawienia.Ale drugi, bardziej zaawansowany krok obejmuje sterownik filtra gitattribute i dodaje krok rozmazywania
Ilekroć aktualizujesz działające drzewo, skrypt może, tylko dla plików określonych w
.gitattributes
, wymusićLF eol
i każdą inną opcję formatowania, którą chcesz wymusić.Jeśli
clear
skrypt „ ” nic nie robi, będziesz (po zatwierdzeniu) transformował pliki, stosując dokładnie taki format, jakiego potrzebujesz.źródło
.txt
rozszerzeniem. Lepiej najpierw to ustalić i przetestować na określonej grupie, zanim uogólnisz na *, i dodaj regułę ujemną,!*.xyz ...
aby wykluczyć kilka plików z tej reguły..gitattributes
wiersze powinny brzmieć:*.txt text eol=lf
zgodnie z git-scm.com/docs/gitattributes.gitattributes
musimy zrobićgit add --renormalize .
Właściwym sposobem na uzyskanie końcówek LF w systemie Windows jest najpierw ustawienie
core.autocrlf
nafalse
:Musisz to zrobić, jeśli używasz msysgit, ponieważ ustawia go
true
w ustawieniach systemowych.Teraz git nie dokona żadnej normalizacji kończącej linię. Jeśli chcesz sprawdzić w pliki mają być znormalizowane, to zrobić: Ustaw
text=auto
w swojej.gitattributes
dla wszystkich plików:I ustaw
core.eol
nalf
:Teraz możesz także przełączyć pojedyncze repozytorium na crlf (w katalogu roboczym!), Uruchamiając
Po zakończeniu konfiguracji możesz chcieć, aby git znormalizował wszystkie pliki w repozytorium . Aby to zrobić, przejdź do katalogu głównego repozytorium i uruchom następujące polecenia:
Jeśli teraz chcesz, aby git również normalizował pliki w katalogu roboczym , uruchom następujące polecenia:
źródło
git diff --cached --name-only -z | xargs -0 git add
git diff --cached --name-only
?git clone --config core.autocrlf=false <repo path>
.Często wracam do tej odpowiedzi, choć żadna z nich nie jest dla mnie odpowiednia. To powiedziawszy, właściwa odpowiedź jest dla mnie mieszanką innych.
Uważam, że działa to:
W przypadku repozytoriów, które zostały wyrejestrowane po ustawieniu globalnych ustawień, wszystko zostanie wyrejestrowane tak, jak jest w repo - miejmy nadzieję
LF
(\n
). WszelkieCRLF
zostaną przekonwertowane na tylkoLF
przy zameldowaniu.Przy istniejącym repozytorium, które już wypisałeś - który ma poprawne zakończenia linii w repozytorium, ale nie kopię roboczą - możesz uruchomić następujące polecenia, aby to naprawić:
Spowoduje to usunięcie
rm
rekursywnie (r
) bez pytania (-f
), wszystkie pliki oprócz tych, które edytowałeś (--cached
), z bieżącego katalogu (.
).reset
Następnie powrót wszystkich tych plików do stanu, w którym mają one swoje prawdziwe zakończeń linii (odpowiadający co jest w repo).Jeśli chcesz naprawić zakończenia linii plików w repozytorium, zalecam skorzystanie z edytora, który pozwoli ci to zrobić zbiorczo, takiego jak IntelliJ lub Sublime Text, ale jestem pewien, że każdy dobry może to obsługiwać.
źródło
Notepad++
w prawym dolnym rogu pokazuje także koniec linii otwartego pliku. Kliknięcie prawym przyciskiem myszy tego pola pozwoli Ci zmienić zakończenia linii.core.autocrlf input
Opcja nadpisujecore.eol
ustawienie, więc ustawienie obu jest zbędny. (Zobacz git-scm.com/docs/git-config )Kontekst
Jeśli ty
możesz to zrobić zaczynając od git 2.10. Wymagane jest 2.10 lub nowsze, ponieważ 2.10 naprawiło zachowanie text = auto wraz z eol = lf . Źródło .
Rozwiązanie
Umieść
.gitattributes
plik w katalogu głównym repozytorium git o następującej zawartości:Zaangażuj się.
Opcjonalne poprawki
Możesz także dodać
.editorconfig
w katalogu głównym repozytorium, aby nowoczesne narzędzia tworzyły nowe pliki z pożądanymi zakończeniami linii.źródło
core.autocrlf=input
jest właściwym ustawieniem dla tego, czego chcesz, ale może być konieczne wykonanie agit update-index --refresh
i / lub a,git reset --hard
aby zmiana zaczęła obowiązywać.Po
core.autocrlf
ustawieniu nainput
git nie będzie stosował konwersji nowego wiersza przy kasie (więc jeśli masz LF w repozytorium, dostaniesz LF), ale upewni się, że w przypadku zepsucia się i wprowadzenia niektórych CRLF w działającym jakoś skopiować, nie dostaną się do repozytorium.źródło
Rozwiązanie tego problemu można znaleźć na stronie : https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings
Uproszczony opis sposobu rozwiązania tego problemu w systemie Windows:
Globalne ustawienia zakończeń linii Polecenie git config core.autocrlf służy do zmiany sposobu, w jaki Git obsługuje zakończenia linii. To wymaga jednego argumentu.
W systemie Windows po prostu przekazujesz wartość true konfiguracji. Na przykład: C:> git config --global core.autocrlf true
Powodzenia, mam nadzieję, że pomogłem.
źródło