Saya telah membaca banyak pertanyaan dan jawaban yang berbeda tentang Stack Overflow juga dokumentasi git tentang bagaimana pengaturan core.autocrlf bekerja.
Ini adalah pemahaman saya dari apa yang saya baca:
Klien Unix dan Mac OSX (pra-OSX menggunakan CR) menggunakan ujung garis LF.
Klien Windows menggunakan ujung garis CRLF.
Ketika core.autocrlf disetel ke true pada klien, repositori git selalu menyimpan file dalam format akhiran LF dan akhiran baris dalam file pada klien dikonversi bolak-balik saat check out / commit untuk klien (yaitu Windows) yang menggunakan non -LF akhir baris, tidak peduli apa format file akhir baris pada klien (ini tidak setuju dengan definisi Tim Clem - lihat pembaruan di bawah).
Berikut ini adalah matriks yang mencoba mendokumentasikan hal yang sama untuk pengaturan 'input' dan 'false' dari core.autocrlf dengan tanda tanya di mana saya tidak yakin dengan perilaku konversi akhir baris.
Pertanyaan saya adalah:
- Apa yang seharusnya menjadi tanda tanya?
- Apakah matriks ini benar untuk "tanda non-pertanyaan"?
Saya akan memperbarui tanda tanya dari jawaban saat konsensus tampaknya terbentuk.
nilai core.autocrlf input benar salah -------------------------------------------------- -------- berkomitmen | pindah agama? ? baru | ke LF (dikonversi ke LF?) (tidak ada konversi?) berkomitmen | ubah ke ? tidak ada | Konversi LF (convert to LF?) checkout | ubah ke ? tidak ada | Konversi CRLF (tidak ada konversi?)
Saya tidak benar-benar mencari pendapat tentang pro dan kontra dari berbagai pengaturan. Saya hanya mencari data yang menjelaskan bagaimana mengharapkan git beroperasi dengan masing-masing dari tiga pengaturan.
-
Pembaruan 04/17/2012 : Setelah membaca artikel oleh Tim Clem yang ditautkan oleh JJD dalam komentar, saya telah memodifikasi beberapa nilai dalam nilai "tidak dikenal" pada tabel di atas, serta mengubah "checkout yang ada | true to convert ke CRLF bukannya dikonversi ke klien ". Berikut adalah definisi yang dia berikan, yang lebih jelas daripada apa pun yang saya lihat di tempat lain:
core.autocrlf = false
Ini adalah standarnya, tetapi kebanyakan orang dianjurkan untuk segera mengubahnya. Hasil dari menggunakan false adalah bahwa Git tidak pernah mengacaukan akhiran baris pada file Anda. Anda dapat memeriksa file dengan LF atau CRLF atau CR atau campuran acak dari ketiga dan Git tidak peduli. Ini dapat membuat perbedaan lebih sulit untuk dibaca dan penggabungan menjadi lebih sulit. Kebanyakan orang yang bekerja di dunia Unix / Linux menggunakan nilai ini karena mereka tidak memiliki masalah CRLF dan mereka tidak perlu Git untuk melakukan pekerjaan tambahan setiap kali file ditulis ke database objek atau ditulis ke dalam direktori kerja.
core.autocrlf = benar
Ini berarti bahwa Git akan memproses semua file teks dan memastikan bahwa CRLF diganti dengan LF saat menulis file itu ke database objek dan mengubah semua LF kembali menjadi CRLF ketika menulis ke direktori kerja. Ini adalah pengaturan yang disarankan pada Windows karena memastikan bahwa repositori Anda dapat digunakan pada platform lain sambil mempertahankan CRLF di direktori kerja Anda.
core.autocrlf = input
Ini berarti bahwa Git akan memproses semua file teks dan memastikan bahwa CRLF diganti dengan LF saat menulis file itu ke database objek. Namun, itu tidak akan melakukan yang sebaliknya. Ketika Anda membaca file kembali dari objek database dan menuliskannya ke direktori kerja, mereka masih memiliki LF untuk menunjukkan akhir baris. Pengaturan ini umumnya digunakan pada Unix / Linux / OS X untuk mencegah CRLF dari ditulis ke dalam repositori. Gagasannya adalah jika Anda menempelkan kode dari browser web dan secara tidak sengaja memasukkan CRLF ke salah satu file Anda, Git akan memastikan bahwa kode itu diganti dengan LF ketika Anda menulis ke database objek.
Artikel Tim sangat bagus, satu-satunya hal yang dapat saya pikirkan yang hilang adalah ia menganggap repositori dalam format LF, yang tidak selalu benar, terutama untuk proyek-proyek Windows saja.
Membandingkan artikel Tim dengan jawaban tertinggi sampai saat ini oleh jmlane menunjukkan persetujuan sempurna pada pengaturan input dan benar serta ketidaksepakatan pada pengaturan palsu.
sumber
autocrlf
kesalahan tampaknya jauh lebih mudah;) stackoverflow.com/questions/2333424/...Jawaban:
Penjelasan terbaik tentang cara
core.autocrlf
kerja ditemukan di halaman manual gitattributes , di bagiantext
atribut.Beginilah
core.autocrlf
tampaknya berfungsi saat ini (atau setidaknya sejak v1.7.2 dari apa yang saya ketahui):core.autocrlf = true
LF
karakter dinormalisasi keCRLF
dalam pohon kerja Anda; file yang berisiCRLF
dalam repositori tidak akan disentuhLF
karakter dalam repositori, yang dinormalisasi dariCRLF
keLF
ketika berkomitmen kembali ke repositori. File yang berisiCRLF
dalam repositori akan dikomit tak tersentuh.core.autocrlf = input
CRLF
karakter dinormalisasi keLF
saat berkomitmen kembali ke repositori.core.autocrlf = false
core.eol
menentukan karakter EOL dalam file teks pohon kerja Anda.core.eol = native
secara default, yang berarti Windows EOLsCRLF
dan * nix EOLs beradaLF
di pohon yang berfungsi.gitattributes
Pengaturan repositori menentukan normalisasi karakter EOL untuk komit ke repositori (standarnya adalah normalisasiLF
karakter).Saya baru saja meneliti masalah ini dan saya juga menemukan situasinya sangat berbelit-belit. The
core.eol
pengaturan pasti membantu menjelaskan bagaimana karakter EOL ditangani oleh git.sumber
core.autocrlf = false
, jika saya tidak memilikigitattributes
file apakah itu berarti tidak akan ada normalisasi? Atau apakah itu berarti akan menggunakan normalisasi default?.gitattributes
file lebih diutamakan daripadacore.autocrlf
pengaturan?Masalah EOL dalam proyek platform campuran telah membuat hidup saya sengsara untuk waktu yang lama. Masalah biasanya muncul ketika sudah ada file dengan EOL berbeda dan campuran sudah di repo. Ini berarti:
CRLF
danLF
dalam file yang sama.Bagaimana ini terjadi bukanlah masalah di sini, tetapi itu memang terjadi.
Saya menjalankan beberapa tes konversi pada Windows untuk berbagai mode dan kombinasinya.
Inilah yang saya dapatkan, dalam tabel yang sedikit dimodifikasi:
Seperti yang Anda lihat, ada 2 kasus ketika konversi terjadi pada komit (3 kolom kiri). Dalam kasus-kasus lainnya, file-file tersebut dibuat apa adanya.
Saat checkout (3 kolom kanan), hanya ada 1 kasus di mana konversi terjadi ketika:
core.autocrlf
adalahtrue
danLF
EOL.Paling mengejutkan bagi saya, dan saya menduga, penyebab banyak masalah EOL adalah bahwa tidak ada konfigurasi di mana EOL campuran seperti
CRLF
+LF
mendapatkan dinormalisasi.Perhatikan juga bahwa EOL Mac "lama"
CR
hanya juga tidak pernah dapat dikonversi.Ini berarti bahwa jika skrip konversi EOL yang ditulis dengan buruk mencoba untuk mengkonversi file akhir campuran dengan
CRLF
s +LF
s, dengan hanya mengubahLF
s keCRLF
s, maka itu akan meninggalkan file dalam mode campuran dengan "kesepian"CR
di mana aCRLF
dikonversi menjadiCRCRLF
.Git kemudian tidak akan mengkonversi apa pun, bahkan dalam
true
mode, dan kekacauan EOL berlanjut. Ini benar-benar terjadi pada saya dan mengacaukan file saya dengan sangat buruk, karena beberapa editor dan kompiler (misalnya VS2010) tidak suka Mac EOLs.Saya kira satu-satunya cara untuk benar-benar menangani masalah ini adalah dengan menormalkan seluruh repo secara berkala dengan memeriksa semua file dalam
input
ataufalse
mode, menjalankan normalisasi yang tepat dan melakukan kembali file yang diubah (jika ada). Di Windows, mungkin melanjutkan bekerja dengancore.autocrlf true
.sumber
core.autocrlf true
. Saya pribadi percaya ituinput
harus selalu digunakan.Hal-hal akan berubah di bagian depan "konversi konversi", dengan Git 1.7.2 yang akan datang :
Pengaturan konfigurasi baru
core.eol
sedang ditambahkan / dikembangkan :Evolusi lain sedang dipertimbangkan :
git 2.8 (Maret 2016) meningkatkan cara
core.autocrlf
mempengaruhi eol:Lihat komit 817a0c7 (23 Feb 2016), melakukan 6e336a5 , komit df747b8 , komit df747b8 (10 Feb 2016), melakukan df747b8 , komit df747b8 (10 Feb 2016), dan komit 4b4024f , komit bb211b4 , komit 92cce13 , komit 320d39c , komit 4b4024f , komit bb211b4 , komit 92cce13 , komit 320d39c (05 Feb 2016) oleh Torsten Bögershausen (
tboegi
) .(Digabung oleh Junio C Hamano -
gitster
- di commit c6b94eb, 26 Feb 2016)Sebagai torek menambahkan dalam komentar :
Untuk lebih lanjut tentang itu, lihat " Apa perbedaan antara autocrlf dan eol ".
sumber
core.eol
tentang "memodifikasi secara otomatis" hanya apa yang Anda nyatakan secara eksplisit dalam sebuah.gitattributes
file. Ini berbeda daricore.autocrlf
yang berlaku untuk file apa pun di repo. Ini adalah proses deklaratif.git add
alih-alih padagit commit
waktu. (Catat itugit commit -a
atau--only
atau--include
jangan menambahkan file ke indeks pada waktu itu.) Namun, untuk apa nilainya, Anda dan saya dan Linus Torvalds semua membenci gagasan VCS yang pernah memodifikasi apa yang sedang dilakukan. Tetapi ada semua pengguna Windows ... :-)core.autocrlf
nilai tidak tergantung pada tipe OS tetapi pada nilai default Windowstrue
dan untuk Linux -input
. Saya mengeksplorasi 3 nilai yang mungkin untuk kasus komit dan checkout dan ini adalah tabel yang dihasilkan:sumber
CR
sendiri tidak pernah disentuh.false
tidak pernah menyentuh ujung garis.true
selalu melakukanLF
dan memeriksa sebagaiCRLF
. Daninput
selalu melakukan apa adanyaLF
dan memeriksa apa adanya.Inilah pemahaman saya tentang hal itu sejauh ini, kalau-kalau itu membantu seseorang.
core.autocrlf=true
dancore.safecrlf = true
Anda memiliki repositori di mana semua ujung jalurnya sama , tetapi Anda bekerja pada platform yang berbeda. Git akan memastikan akhir baris Anda dikonversi ke default untuk platform Anda. Mengapa ini penting? Katakanlah Anda membuat file baru. Editor teks pada platform Anda akan menggunakan akhiran baris default. Ketika Anda memeriksanya, jika Anda tidak memiliki core.autocrlf disetel ke true, Anda telah memperkenalkan inkonsistensi penghentian baris untuk seseorang di platform yang default ke akhiran baris yang berbeda. Saya selalu mengatur safecrlf juga karena saya ingin tahu bahwa operasi crlf dapat dibalik. Dengan kedua pengaturan ini, git memodifikasi file Anda, tetapi itu memverifikasi bahwa modifikasi tersebut dapat dibalik .
core.autocrlf=false
Anda memiliki repositori yang sudah memiliki akhiran garis campur yang dicentang dan memperbaiki ujung saluran yang salah dapat merusak hal-hal lain. Yang terbaik adalah tidak memberi tahu git untuk mengubah akhir baris dalam kasus ini, karena itu akan memperburuk masalah yang dirancang untuk dipecahkan - membuat diff lebih mudah dibaca dan digabung menjadi lebih mudah. Dengan pengaturan ini, git tidak mengubah file Anda .
core.autocrlf=input
Saya tidak menggunakan ini karena alasan untuk ini adalah untuk menutupi kasus penggunaan di mana Anda membuat file yang memiliki ujung garis CRLF pada platform yang default ke ujung garis LF. Saya lebih suka membuat editor teks saya selalu menyimpan file baru dengan default akhir baris platform.
sumber
Tidak, jawaban @jmlane salah.
Untuk
Checkin (git add, git commit)
:text
propertiSet, Set value to 'auto'
, konversi terjadi ketika file telah dilakukan dengan 'CRLF'text
propertiUnset
: tidak ada yang terjadi, kecuali untukCheckout
text
propertiUnspecified
, konversi tergantung padacore.autocrlf
autocrlf = input or autocrlf = true
, konversi hanya terjadi ketika file dalam repositori adalah 'LF', jika telah menjadi 'CRLF', tidak ada yang akan terjadi.autocrlf = false
, tidak ada yang terjadiUntuk
Checkout
:text
propertiUnset
: tidak ada yang terjadi.text
propertiSet, Set value to 'auto
: itu tergantung padacore.autocrlf
,core.eol
.core.eol
text
propertiUnspecified
, itu tergantung padacore.autocrlf
.2.1
2.2
text
propertiUnspecified
Perilaku default
Jadi perilaku Default adalah
text
properti adalahUnspecified
dancore.autocrlf = false
:Kesimpulan
text
properti diatur, perilaku checkin tergantung pada dirinya sendiri, bukan pada autocrlfsumber
Melakukan beberapa tes di linux dan windows. Saya menggunakan file uji yang berisi baris yang diakhiri dengan LF dan juga baris yang diakhiri dengan CRLF.
File dikomit, dihapus dan kemudian diperiksa. Nilai dari core.autocrlf ditetapkan sebelum melakukan dan juga sebelum checkout. Hasilnya di bawah.
sumber