Windows git "warning: LF akan digantikan oleh CRLF", apakah peringatan itu mundur?

147

env:

  • Windows 7
  • msysgit

Wheng I git commit, katanya:

warning: LF will be replaced by CRLF. 

Apakah peringatan ini mundur?
Saya mengedit file di Windows, akhir baris adalah CRLF, seperti gambar ini:
masukkan deskripsi gambar di sini
Dan git mengubahnya LFuntuk berkomitmen untuk repo.
Jadi saya pikir peringatan yang benar adalah:

warning: CRLF will be replaced by LF. 
Honghe.Wu
sumber
2
@ evnull Maksud saya peringatannya terbalik, kan?
Honghe.Wu
@ Honghe. Kamu Tidak, ini bukan di Windows. Saya telah mengedit jawaban saya di bawah ini
VonC
11
Pertanyaan yang bagus karena memang, peringatan itu tampaknya terbelakang. Sangat membingungkan untuk mendapatkan peringatan tentang konversi ke CRLF ini di atas komit dan tidak ada penjelasan yang menjelaskan bagaimana penanganan Git terhadap spasi putih akan membantu, karena peringatan itu mundur .
Stijn de Witt
1
@StijndeWitt Saya ingin melihat Anda berkomentar sebagai jawaban untuk meningkatkannya.
user1460043

Jawaban:

185

peringatan: LF akan diganti oleh CRLF.

Bergantung pada editor yang Anda gunakan, file teks dengan LF tidak perlu disimpan dengan CRLF: editor terbaru dapat mempertahankan gaya eol. Tapi itu pengaturan konfigurasi git bersikeras mengubah mereka ...

Pastikan saja (seperti yang saya rekomendasikan di sini ):

git config --global core.autocrlf false

Dengan begitu, Anda menghindari transformasi otomatis, dan masih dapat menentukannya melalui .gitattributesfile dan core.eolarahan .


windows git "LF akan digantikan oleh CRLF"
Apakah peringatan ini mundur?

Tidak: Anda menggunakan Windows, dan git confighalaman bantuan menyebutkan

Gunakan pengaturan ini jika Anda ingin memiliki CRLFakhir baris di direktori kerja Anda meskipun repositori tidak memiliki akhir baris normal.

Seperti yang dijelaskan dalam " git mengganti LF dengan CRLF ", itu hanya akan terjadi pada checkout (tidak komit), dengan core.autocrlf=true.

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Seperti disebutkan dalam Xiaopeng 's jawaban , bahwa peringatan adalah sama dengan:

peringatan: (Jika Anda memeriksanya / atau mengkloning ke folder lain dengan core.autocrlfkonfigurasi Anda saat ini ,) LF akan digantikan oleh CRLF
File akan memiliki akhiran baris aslinya di direktori kerja Anda (saat ini).

Sebagaimana disebutkan dalam git-for-windows/gitedisi 1242 :

Saya masih merasa pesan ini membingungkan, pesan dapat diperluas untuk memasukkan penjelasan yang lebih baik tentang masalah ini, misalnya: "LF akan diganti oleh CRLF file.jsonsetelah menghapus file dan memeriksanya lagi".

Catatan: Git 2.19 (September 2018), saat menggunakan core.autocrlf, peringatan palsu "LF akan digantikan oleh CRLF" sekarang ditekan .


Seperti komentar quaylar dengan benar , jika ada konversi pada komit, itu hanya untuk .LF

Peringatan khusus itu " LF will be replaced by CRLF" berasal dari convert.c # check_safe_crlf () :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

Itu disebut dengan convert.c#crlf_to_git(), itu sendiri disebut dengan convert.c#convert_to_git(), itu sendiri disebut dengan convert.c#renormalize_buffer().

Dan yang terakhir renormalize_buffer()hanya dipanggil oleh merge-recursive.c#blob_unchanged().

Jadi saya menduga konversi ini terjadi git commithanya jika komit dikatakan merupakan bagian dari proses penggabungan.


Catatan: dengan Git 2.17 (Q2 2018), pembersihan kode menambah beberapa penjelasan.

Lihat commit 8462ff4 (13 Jan 2018) oleh Torsten Bögershausen ( tboegi) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 9bc89b1 , 13 Feb 2018)

convert_to_git (): safe_crlf / checksafe menjadi int_flags

Saat memanggil convert_to_git(), checksafeparameter menentukan apa yang harus terjadi jika konversi EOL ( CRLF --> LF --> CRLF) tidak bolak-balik bersih.
Selain itu, ini juga ditentukan jika ujung baris harus dinormalisasi ulang ( CRLF --> LF) atau dijaga sebagaimana adanya.

checksafe adalah safe_crlfenum dengan nilai-nilai ini:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Perhatikan bahwa regresi yang diperkenalkan pada 8462ff4 (" convert_to_git(): safe_crlf/checksafemenjadi int conv_flags", 2018-01-13, Git 2.17.0) kembali dalam siklus Git 2.17 menyebabkan autocrlfpenulisan ulang menghasilkan pesan peringatan meskipun telahsafecrlf=false diatur .

Lihat komit 6cb0912 (04 Jun 2018) oleh Anthony Sottile ( asottile) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 8063ff9 , 28 Jun 2018)

VONC
sumber
1
Ya, sebagian besar editor dapat mempertahankan gaya EOL, tetapi dengan sebagian besar editor, itu tidak berpengaruh ketika membuat file baru di proyek yang sama. Pastikan Anda tidak checkout proyek LF, pikirkan "psh, editor saya dapat menangani akhiran LF, saya tidak perlu autocrlf", dan kemudian lupa untuk secara manual mengatur file baru ke akhiran LF.
15
@VonC Saya harus mengakui bahwa saya tidak mengerti. Git-Book menyatakan Git dapat menangani hal ini dengan mengonversi akhir baris CRLF menjadi LF ketika Anda melakukan, dan sebaliknya ketika memeriksa kode ke sistem file Anda. Ini berarti bahwa pada komit akan ada konversi ke LF dan tidak pernah ke CRLF . Yang berarti peringatan tersebut salah. Memiliki core.autocrlf=trueakan selalu menghasilkan LF di repo, dan CRLF di working tree imho (bahkan di bawah non-Windows). Sumber: link
quaylar
12
"Apakah peringatan ini mundur? Seharusnya hanya terjadi pada checkout" Saya melihat peringatan ini tepat pada komit . Jadi ya , itu mundur. Itu terbelakang memicu saya mencari ini. Senang orang lain juga memperhatikannya! Sangat membingungkan bagi orang yang benar-benar membaca peringatan ini untuk melihatnya mengatakan itu akan dikonversi ke CRLF pada pesan komit.
Stijn de Witt
7
"Jadi saya menduga konversi ini terjadi pada komit git hanya jika komit tersebut merupakan bagian dari proses penggabungan." Nggak. Saya melihat ini pada komitmen reguler.
Stijn de Witt
3
Bagian yang menggangguku tentang pesan itu adalah bahwa ia muncul sama sekali. mengapa saya perlu DIPERINGATKAN bahwa git akan melakukan persis apa yang telah saya konfigurasikan. Saya tidak memerlukan peringatan yang mengatakan "hei, kami masih mengonversi akhiran baris untuk Anda, seperti yang Anda minta". Ketika sistem berperilaku berdasarkan desain, ia seharusnya tidak memberikan peringatan yang tidak perlu, atau orang melewatkan peringatan penting dalam lautan pesan yang tidak relevan.
Brent Larsen
27

YA peringatannya mundur.

Dan sebenarnya itu seharusnya tidak menjadi peringatan. Karena semua peringatan ini mengatakan (tetapi sayangnya mundur) adalah bahwa karakter CRLF dalam file Anda dengan ujung garis Windows akan diganti dengan LF saat komit. Yang berarti itu dinormalisasi ke akhir baris yang sama yang digunakan oleh * nix dan MacOS.

Tidak ada yang aneh terjadi, ini adalah perilaku yang biasanya Anda inginkan.

Peringatan ini dalam bentuk saat ini adalah salah satu dari dua hal:

  1. Bug yang tidak menguntungkan dikombinasikan dengan pesan peringatan yang terlalu berhati-hati, atau
  2. Plot yang sangat pintar untuk membuat Anda benar-benar memikirkan ini ...

;)

Stijn de Witt
sumber
1
Apa yang aneh adalah bahwa jika Anda secara paksa mengkonversi file lokal pada Windows ke LF Anda bahkan tidak dapat git menambahkan file, pesannya mengeluh dan membatalkan komit Anda.
phpguru
24

--Perbaharui pada 9 Juli ---

Dihapus "Itu benar dan akurat" seperti yang dikomentari oleh @mgiuca

======

TIDAK . Ini TIDAK berbicara tentang file Anda saat ini dengan CRLF. Alih-alih itu berbicara tentang file dengan LF.

Itu harus membaca:

peringatan: ( Jika Anda memeriksanya / atau mengkloning ke folder lain dengan konfigurasi core.autocrlf Anda saat ini ,) LF akan digantikan oleh CRLF

File akan memiliki akhiran baris aslinya di direktori kerja Anda ( saat ini ).

Gambar ini harus menjelaskan apa artinya. masukkan deskripsi gambar di sini

Xiao Peng - ZenUML.com
sumber
1
Ilustrasi yang bagus. +1. Saya telah mereferensikan jawaban Anda di saya untuk lebih banyak visibilitas.
VonC
Apa yang bekerja dengan baik untuk saya adalah: 1) core.autocrlf = false 2) di Intellij set Line separator (\ n). Saya menggunakan Ide Intellij pada Mac dan Windows.
Xiao Peng - ZenUML.com
Ini dapat terjadi ketika file dibuat di Windows tetapi memiliki akhiran baris unix / mac (lf) dan properti git config Anda autocrlf benar. Pada dasarnya git tidak akan mengubah file yang Anda buat, tetapi itu akan memeriksanya / mengkloningnya dengan akhiran garis windows (karena pengaturan autocrlf Anda)
Patrick
1
Bagaimana peringatan itu benar dan akurat jika Anda harus memenuhi syarat dengan "Jika Anda memeriksanya / atau mengkloning ke folder lain dengan konfigurasi core.autocrlf Anda saat ini". Bukan itu yang dikatakan pesan aslinya. Dikatakan itu AKAN (tidak mungkin) digantikan oleh CRLF, menyiratkan bahwa itu akan disimpan dalam mode CRLF di repo itu sendiri, bukan dalam beberapa checkout hipotetis di masa depan.
mgiuca
12

Semua ini mengasumsikan core.autocrlf=true

Kesalahan asli:

peringatan: LF akan digantikan oleh CRLF
File akan memiliki akhiran baris aslinya di direktori kerja Anda.

Apa yang harus dibaca kesalahan:

peringatan: LF akan digantikan oleh CRLF di direktori kerja Anda
. File tersebut akan memiliki akhiran LF asli di repositori git

Penjelasan di sini :

Efek samping dari konversi yang mudah digunakan ini, dan ini adalah tentang peringatan yang Anda lihat, adalah bahwa jika file teks yang Anda tulis awalnya memiliki akhiran LF bukan CRLF, itu akan disimpan dengan LF seperti biasa, tetapi ketika diperiksa keluar nanti akan memiliki akhiran CRLF. Untuk file teks normal ini biasanya baik-baik saja. Peringatan adalah "untuk informasi Anda" dalam kasus ini, tetapi jika git salah menilai file biner menjadi file teks, itu adalah peringatan penting karena git kemudian akan merusak file biner Anda.

Pada dasarnya, file lokal yang sebelumnya LF sekarang akan memiliki CRLF secara lokal

mikew
sumber
7

git config --global core.autocrlf false berfungsi dengan baik untuk pengaturan global.

Tetapi jika Anda menggunakan Visual Studio, mungkin juga perlu memodifikasi .gitattributesuntuk beberapa jenis proyek ( misalnya aplikasi perpustakaan c # class ):

  • hapus garis * text=auto
Eric Wang
sumber
1

Setelah saya mengatur core.autocrlf=truesaya mendapatkan "LF akan diganti oleh CRLF" (perhatikan bukan "CRLF akan digantikan oleh LF") ketika saya sedang git add(atau mungkin itu pada git commit?) File yang diedit di windows pada repositori (yang tidak menggunakan LF) yang sudah diperiksa sebelum saya set core.autocrlf=true.

Saya sudah melakukan checkout baru core.autocrlf=truedan sekarang saya tidak mendapatkan pesan itu.

Marsette Vona
sumber
0

Jika Anda menggunakan Visual Studio 2017, 2019, Anda dapat:

  1. buka .gitignore utama (perbarui atau hapus file .gitignore lain di proyek lain dalam solusi)
  2. rekatkan kode di bawah ini:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process
Javier Cañon
sumber
1
"Kode" itu terlihat seperti itu harus dalam file config suka .gitconfigatau .git/configtidak .gitignore, yang menentukan file yang akan diabaikan oleh git.
davidA
Saya menambahkan ini ke .git / config tetapi masih "peringatan: CRLF akan digantikan oleh LF" muncul
Sergei
0

Lakukan hal yang sederhana:

  1. Buka git-hub (Shell) dan navigasikan ke file direktori milik (cd / a / b / c / ...)
  2. Jalankan dos2unix (kadang-kadang dos2unix.exe)
  3. Coba komit sekarang. Jika Anda mendapatkan kesalahan yang sama lagi. Lakukan semua langkah di atas kecuali alih-alih dos2unix, lakukan unix2dox (kadang-kadang unix2dos.exe)
Antriksh Jain
sumber