Przeważnie .gitattributes
plik ma * text=auto
. Jaki jest cel text=auto
tego pliku?
Przeważnie .gitattributes
plik ma * text=auto
. Jaki jest cel text=auto
tego pliku?
Odpowiedzi:
Z dokumentów :
Każdy wiersz w
.gitattributes
(lub.git/info/attributes
) pliku ma postać:pattern attr1 attr2 ...
Więc tutaj wzorzec to *
, co oznacza wszystkie pliki, a atrybut to text=auto
.
Co robi text=auto
? Z dokumentacji:
Gdy tekst jest ustawiony na „auto”, ścieżka jest oznaczana do automatycznej normalizacji końca wiersza. Jeśli Git zdecyduje, że zawartość jest tekstem, jej zakończenia linii są normalizowane do LF podczas sprawdzania.
Jakie jest domyślne zachowanie, jeśli nie jest włączone?
Nieokreślony
Jeśli atrybut tekstowy jest nieokreślony, Git używa zmiennej konfiguracyjnej core.autocrlf do określenia, czy plik powinien zostać przekonwertowany.
Co robi core.autocrlf
? Z dokumentów:
core.autocrlf
Ustawienie tej zmiennej na „prawda” jest prawie takie samo, jak ustawienie atrybutu tekstowego na „auto” we wszystkich plikach, z wyjątkiem tego, że nie ma gwarancji, że pliki tekstowe zostaną znormalizowane: pliki, które zawierają CRLF w repozytorium, nie zostaną dotknięte. Użyj tego ustawienia, jeśli chcesz mieć zakończenia linii CRLF w katalogu roboczym, nawet jeśli repozytorium nie ma znormalizowanych zakończeń linii. Tę zmienną można ustawić na wejście, w którym to przypadku nie jest wykonywana żadna konwersja danych wyjściowych.
Jeśli uważasz, że to wszystko jest jasne jak błoto, nie jesteś sam.
Oto, co * text=auto
robi w moich słowach: kiedy ktoś zatwierdza plik, Git zgaduje, czy ten plik jest plikiem tekstowym, czy nie, a jeśli tak, zatwierdzi wersję pliku, w której wszystkie bajty CR + LF zostaną zastąpione bajtami LF. Nie wpływa to bezpośrednio na wygląd plików w drzewie roboczym, istnieją inne ustawienia, które konwertują bajty LF na bajty CR + LF podczas sprawdzania pliku.
Chciałbym nie zaleca umieszczenie * text=auto
w .gitattributes
pliku. Zamiast tego poleciłbym coś takiego:
*.txt text
*.html text
*.css text
*.js text
To wyraźnie określa, które pliki są plikami tekstowymi, które są konwertowane CRLF do LF w bazie danych obiektów (ale niekoniecznie w drzewie roboczym). Mieliśmy repozytorium * text=auto
, a Git źle zgadł, że plik obrazu jest plikiem tekstowym, powodując uszkodzenie go, ponieważ zastąpił bajty CR + LF bajtami LF w bazie danych obiektów. Debugowanie tego nie było przyjemne.
Jeśli musisz użyć * text=auto
, umieść go jako pierwszą linię .gitattributes
, aby późniejsze linie mogły to zastąpić. Wydaje się, że praktyka ta staje się coraz bardziej popularna.
everyone
odwołujesz się do git-scm
, to prawdopodobnie dlatego, że opracowują pakiet * nix i dlatego używanie znaku nowej linii * nix jest normalne .
git-scm
pochodzące z * nix. MacOS używa LF. Tylko Windows (biorąc pod uwagę tylko główne systemy operacyjne) używa CRLF. Utrudnia to programistom używającym narzędzi * nix w systemie Windows i wszystkim podczas wymiany plików. Zobacz także Dlaczego CRLF .
*.txt text=auto
i *.txt text
please? Pomyślałem, że wszystkie 4 linie w powyższym przykładzie powinny być text=auto
, a nie tylko text
po rozszerzeniu pliku. Na przykład pliki footprintów programu KiCad (rozszerzenie „.kicad_mod”) są normalizowane za pomocą tego wiersza w ich pliku gitattributes: *.kicad_mod text=auto
( kicad-pcb.org/libraries/klc/G1.7 ).
Zapewnia znormalizowanie zakończeń linii. Źródło: Kernel.org
Gdy tekst jest ustawiony na „auto”, ścieżka jest oznaczana do automatycznej normalizacji końca wiersza. Jeśli git zdecyduje, że zawartość jest tekstem, jej zakończenia linii są normalizowane do LF podczas sprawdzania.
Jeśli chcesz współdziałać z systemem zarządzania kodem źródłowym, który wymusza normalizację końca linii, lub po prostu chcesz, aby wszystkie pliki tekstowe w repozytorium były znormalizowane, powinieneś zamiast tego ustawić atrybut tekstowy na „auto” dla wszystkich plików.
Gwarantuje to, że wszystkie pliki, które git uważa za tekstowe, będą miały znormalizowane (LF) zakończenia wierszy w repozytorium.
When a text file is normalized, its line endings are converted to LF in the repository.
LF
, nawet w oknach?
Ta konfiguracja dotyczy sposobu obsługi zakończeń linii. Po włączeniu wszystkie zakończenia linii są konwertowane na LF w repozytorium. Istnieją inne flagi dotyczące konwertowania zakończeń linii w katalogu roboczym. Pełne informacje o problemie nas tutaj: https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html