Apa tujuan dari `text = auto` dalam file` .gitattributes`?

129

Sebagian besar .gitattributesfile memiliki * text=auto. Apa tujuan dari text=autofile itu?

Fizer Khan
sumber

Jawaban:

77

Dari dokumen :

Setiap baris dalam .gitattributes(atau .git/info/attributes) file berbentuk:

pattern attr1 attr2 ...

Jadi di sini, polanya adalah *, yang berarti semua file, dan atributnya adalah text=auto.

Apa yang text=autoharus dilakukan Dari dokumentasi:

Ketika teks diatur ke "otomatis", jalan ditandai untuk normalisasi end-of-line otomatis. Jika Git memutuskan bahwa kontennya adalah teks, ujung barisnya dinormalisasi menjadi LF pada checkin.

Apa perilaku default jika tidak diaktifkan?

Tidak ditentukan

Jika atribut teks tidak ditentukan, Git menggunakan variabel konfigurasi core.autocrlf untuk menentukan apakah file tersebut harus dikonversi.

Apa yang core.autocrlfharus dilakukan Dari dokumen:

   core.autocrlf

Mengatur variabel ini ke "true" hampir sama dengan mengatur atribut teks ke "auto" pada semua file kecuali bahwa file teks tidak dijamin akan dinormalisasi: file yang berisi CRLF di repositori tidak akan disentuh. Gunakan pengaturan ini jika Anda ingin memiliki ujung garis CRLF di direktori kerja Anda meskipun repositori tidak memiliki ujung garis yang dinormalisasi. Variabel ini dapat diatur ke input, dalam hal ini tidak ada konversi output yang dilakukan.

Jika Anda menganggap ini sejelas lumpur, Anda tidak sendirian.

Inilah yang * text=autodilakukan dalam kata-kata saya: ketika seseorang melakukan file, Git menebak apakah file itu adalah file teks atau tidak, dan jika ya, itu akan melakukan versi file di mana semua byte CR + LF diganti dengan LF byte. Itu tidak secara langsung mempengaruhi seperti apa file di pohon kerja, ada pengaturan lain yang akan mengkonversi LF byte ke CR + LF byte ketika memeriksa file.

Rekomendasi:

Saya akan tidak merekomendasikan menempatkan * text=autodi .gitattributesberkas. Sebagai gantinya, saya akan merekomendasikan sesuatu seperti ini:

*.txt text
*.html text
*.css text
*.js text

Ini secara eksplisit menunjuk file mana yang merupakan file teks, yang membuat CRLF dikonversi ke LF dalam database objek (tetapi tidak harus di pohon kerja). Kami memiliki repo dengan * text=auto, dan Git salah menebak untuk file gambar bahwa itu adalah file teks, menyebabkannya rusak ketika diganti CR + LF byte dengan LF byte di database objek. Itu tidak menyenangkan untuk di-debug.

Jika Anda harus menggunakan * text=auto, masukkan sebagai baris pertama .gitattributes, sehingga baris selanjutnya dapat menimpanya. Ini tampaknya menjadi praktik yang semakin populer.

Flimm
sumber
2
Mengapa semua orang memanggil LF sebagai Normal tetapi tidak CRLF? apakah ada referensi untuk membuktikannya?
Yousha Aleayoub
1
@YoushaAleayoub Apa maksudmu?
Flimm
1
@YoushaAleayoub jika Anda everyonemengacu pada git-scm, itu mungkin karena mereka sedang mengembangkan paket nix * dan dengan demikian menggunakan * karakter nix baris baru adalah biasa .
Justin Moh
4
@YoushaAleayoub LF dianggap sebagai "normal" b / c itu biasa di banyak alat dev. Alat dev populer seperti git-scmberasal dari * nix. MacOS menggunakan LF. Hanya Windows (hanya untuk OS aliran utama) yang menggunakan CRLF. Ini membuat devs lebih sulit menggunakan alat * nix di Windows dan untuk semua orang saat bertukar file. Lihat juga Mengapa CRLF .
Roi Danton
2
@ Flimm, bisakah Anda menjelaskan perbedaan antara *.txt text=autodan *.txt texttolong? Saya pikir semua 4 baris dalam contoh Anda di atas seharusnya text=auto, tidak hanya textsetelah ekstensi file. File jejak KiCad, misalnya (ekstensi ".kicad_mod"), dinormalisasi menggunakan baris ini dalam file gitattributes mereka: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 ).
Gabriel Staples
64

Ini memastikan ujung garis dinormalisasi. Sumber: Kernel.org

Ketika teks diatur ke "otomatis", jalan ditandai untuk normalisasi end-of-line otomatis. Jika git memutuskan bahwa kontennya berupa teks, maka ujung barisnya dinormalisasi menjadi LF pada checkin.

Jika Anda ingin bekerja sama dengan sistem manajemen kode sumber yang memberlakukan normalisasi end-of-line, atau Anda hanya ingin semua file teks dalam repositori Anda dinormalisasi, Anda harus mengatur atribut teks menjadi "otomatis" untuk semua file.

Ini memastikan bahwa semua file yang git anggap sebagai teks akan memiliki akhiran garis normalisasi (LF) dalam repositori.

Dave Zych
sumber
12
Apa yang Anda maksud dengan akhiran garis Normalisasi?
Fizer Khan
14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych
11
Penting untuk diketahui, ini menimpa pengaturan core.autocrlf lokal pada komputer Anda, lihat jawaban hebat ini oleh @Daniel Jomphe
spankmaster79
1
Akan sangat bagus jika git tidak melakukan $% # dengan salah satu file yang diperiksa ke repositori. Saya sudah bekerja dengan SLM, PerForce, MsBuild, Source Depot, TFS, SVM, tidak satupun dari ini akan mengubah bahkan satu byte dalam file Anda. Ini adalah git hack IMO yang berbahaya dan itu telah menyebabkan saya sangat sakit.
Vance McCorkle
1
Apa yang terjadi pada checkout hanya setengah dari cerita - apa yang terjadi pada saat mendapat? Apakah benar untuk mengatakan bahwa pada checkout, akhir baris tetap sama LF, bahkan di windows?
Anthony