Jaki jest cel funkcji „text = auto” w pliku „.gitattributes”?

129

Przeważnie .gitattributesplik ma * text=auto. Jaki jest cel text=autotego pliku?

Fizer Khan
źródło

Odpowiedzi:

77

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=autorobi 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.

Rekomendacje:

Chciałbym nie zaleca umieszczenie * text=autow .gitattributespliku. 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.

Flimm
źródło
2
Dlaczego wszyscy nazywają LF jako Normal, ale nie CRLF? czy jest coś, co mogłoby to udowodnić
Yousha Aleayoub
1
@YoushaAleayoub Co masz na myśli?
Flimm
1
@YoushaAleayoub, jeśli everyoneodwołujesz się do git-scm, to prawdopodobnie dlatego, że opracowują pakiet * nix i dlatego używanie znaku nowej linii * nix jest normalne .
Justin Moh
4
@YoushaAleayoub LF jest uważany za „normalny” b / c, jest powszechny w wielu narzędziach programistycznych. Popularne narzędzia programistyczne, takie jak git-scmpochodzą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 .
Roi Danton
2
@Flimm, czy możesz wyjaśnić różnicę między *.txt text=autoi *.txt textplease? Pomyślałem, że wszystkie 4 linie w powyższym przykładzie powinny być text=auto, a nie tylko textpo 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 ).
Gabriel Staples
64

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.

Dave Zych
źródło
12
Co masz na myśli przez znormalizowane zakończenie linii?
Fizer Khan
14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych
11
Ważne, aby wiedzieć, że nadpisuje to lokalne ustawienie core.autocrlf na twoim komputerze. Zobacz tę świetną odpowiedź @Daniel Jomphe
spankmaster79
1
Byłoby okropnie miło, gdyby git po prostu nie $% #, gdy którykolwiek z plików był wpisywany do repozytorium. I "ve pracował z SLM, siłą rzeczy, msbuild, Source Depot, TFS, SVM, żaden z nich nie ulegnie zmianie nawet jeden bajt w każdym z plików Jest to podstępny git Hack IMO i to sprawiało mi wiele bólu..
Vance McCorkle
1
To, co dzieje się przy kasie, to tylko połowa sukcesu - co dzieje się po otrzymaniu? Czy należałoby powiedzieć, że przy kasie zakończenia linii pozostają tak LF, nawet w oknach?
Anthony