Saya memiliki repositori git yang diinangi di github. Banyak file awalnya dikembangkan di Windows, dan saya tidak terlalu berhati-hati dengan akhiran baris. Ketika saya melakukan commit awal, saya juga tidak memiliki konfigurasi git untuk menegakkan akhir baris yang benar. Hasilnya adalah saya memiliki sejumlah file dengan akhiran garis CRLF di repositori github saya.
Saya sekarang mengembangkan sebagian di Linux, dan saya ingin membersihkan akhir baris. Bagaimana saya bisa memastikan file disimpan dengan benar dengan LF di github, dan memiliki LF di copy pekerjaan saya?
Saya telah menyiapkan .gitattributes
file yang berisi text eol=LF
; Apakah itu benar? Dengan komitmen dan dorongan itu, bisakah saya hanya rm
repo lokal dan klon ulang dari github untuk mendapatkan efek yang diinginkan?
Jawaban:
Tanpa sedikit informasi tentang file apa yang ada di repositori Anda (kode sumber murni, gambar, file yang dapat dieksekusi, ...), agak sulit untuk menjawab pertanyaannya :)
Selain itu, saya akan mempertimbangkan bahwa Anda bersedia untuk default ke LF sebagai akhiran baris di direktori kerja Anda karena Anda bersedia memastikan bahwa file teks memiliki akhiran LF di dalam .git repositori Anda bekerja di Windows atau Linux . Memang lebih baik aman daripada menyesal ....
Namun, ada alternatif yang lebih baik: Manfaat dari ujung jalur LF di workdir Linux Anda, ujung jalur CRLF di ujung Windows workdir Anda DAN ujung jalur LF di repositori Anda.
Saat Anda sedang mengerjakan sebagian Linux dan Windows, pastikan
core.eol
diatur kenative
dancore.autocrlf
diatur ketrue
.Kemudian, ganti konten
.gitattributes
file Anda dengan yang berikut iniIni akan membuat Git menangani konversi akhir baris automagic untuk Anda, saat melakukan dan checkout. File biner tidak akan diubah, file yang terdeteksi sebagai file teks akan melihat akhiran baris dikonversi dengan cepat.
Namun, karena Anda tahu konten repositori Anda, Anda dapat membantu Git dan membantunya mendeteksi file teks dari file biner.
Asalkan Anda bekerja pada proyek pemrosesan gambar berbasis C, ganti konten
.gitattributes
file Anda dengan yang berikut iniIni akan memastikan file yang ekstensi c, h, atau txt akan disimpan dengan ujung garis LF di repo Anda dan akan memiliki ujung garis asli di direktori kerja. File jpeg tidak akan disentuh. Semua yang lain akan mendapat manfaat dari penyaringan automagic yang sama seperti yang terlihat di atas.
Untuk mendapatkan pemahaman yang lebih dalam tentang detail bagian dalam dari semua ini, saya sarankan Anda untuk menyelami postingan yang sangat bagus ini "Pikirkan akhir dari garis Anda" dari Tim Clem, seorang Githubber.
Sebagai contoh dunia nyata, Anda juga dapat mengintip komit ini di mana perubahan itu menjadi a
.gitattributes
tersebut ditunjukkan.Perbarui jawaban dengan mempertimbangkan komentar berikut
Masuk akal. Terimakasih atas klarifikasinya. Dalam konteks khusus ini, the
.gitattributes
file itu sendiri tidak akan cukup.Jalankan perintah berikut terhadap repositori Anda
Karena repositori Anda dibagi antara lingkungan Linux dan Windows Anda, ini akan memperbarui file konfigurasi lokal untuk kedua lingkungan.
core.eol
akan memastikan file teks menghasilkan ujung garis LF saat checkout.core.autocrlf
akan memastikan potensi CRLF dalam file teks (dihasilkan dari operasi salin / tempel misalnya) akan dikonversi ke LF di repositori Anda.Secara opsional, Anda dapat membantu Git membedakan apa itu file teks dengan membuat
.gitattributes
file yang berisi sesuatu yang serupa dengan yang berikut:Jika Anda memutuskan untuk membuat
.gitattributes
file, komit saja .Terakhir, pastikan
git status
menyebutkan "tidak ada komitmen (direktori kerja bersih)" , kemudian lakukan operasi berikutIni akan membuat ulang file Anda di direktori kerja Anda, dengan mempertimbangkan perubahan konfigurasi Anda dan
.gitattributes
file dan mengganti potensi CRLF yang terlewatkan dalam file teks Anda.Setelah ini selesai, setiap file teks dalam direktori kerja Anda AKAN menanggung ujung garis LF dan
git status
harus tetap menganggap workdir sebagai bersih.sumber
vi
kurang senang dengan CRLF. Apakah saya hanya ingin mengubahnya sehinggacore.autocrlf
adalahfalse
(atauinput
)?git checkout-index --force --all
mungkin berfungsi lebih baik. Poin kedua terlihat sedikit keluar dari topik tentang pertanyaan awal. Bagaimana dengan mengajukan pertanyaan khusus?text
daneol=lf
mencapai hasil yang sama seperti yang dijelaskan dalam jawaban Anda melaluicore.eol
dancore.autocrlf
?git checkout-index --force --all
tidak melakukan apa pun untuk saya. Apa yang berhasil adalah daftar perintah dalam instruksi GitHub untuk menangani masalah ini.Dimulai dengan git 2.10 (dirilis 2016-09-03), tidak perlu menghitung setiap file teks secara terpisah. Git 2.10 memperbaiki perilaku text = auto bersamaan dengan eol = lf . Sumber .
.gitattributes
file di root repositori git Anda:Tambahkan dan komit.
Setelah itu, Anda dapat melakukan langkah-langkah berikut dan semua file dinormalisasi sekarang:
Sumber: Jawaban oleh kenorb .
sumber
Untuk memaksa akhir baris LF untuk semua file teks, Anda dapat membuat
.gitattributes
file di tingkat atas repositori Anda dengan baris berikut (ubah sesuai keinginan):yang memastikan bahwa semua file yang Git anggap sebagai file teks telah menormalkan (
LF
) akhiran baris dalam repositori (biasanyacore.eol
konfigurasi mengontrol yang mana yang Anda miliki secara default).Berdasarkan pengaturan atribut baru, file teks apa pun yang mengandung CRLF harus dinormalisasi oleh Git. Jika ini tidak akan terjadi secara otomatis, Anda dapat me-refresh repositori secara manual setelah mengubah akhir baris, sehingga Anda dapat memindai ulang dan melakukan direktori kerja dengan langkah-langkah berikut (diberikan direktori kerja bersih):
atau sesuai dokumen GitHub :
Lihat juga: @Charles Bailey post .
Selain itu, jika Anda ingin mengecualikan file apa pun agar tidak diperlakukan sebagai teks, batalkan atribut teksnya, mis
Atau tandai secara eksplisit sebagai biner:
Untuk melihat beberapa file normalisasi git yang lebih canggih, periksa
.gitattributes
di Drupal core :Lihat juga:
sumber
text=auto
menyesatkan. Anda tidak bisa menggunakantext=auto
daneol
bersama. Pengaturaneol
menonaktifkan deteksi otomatis file teks. Inilah sebabnya mengapa Anda harus menentukan semua jenis file tersebut. Jikaauto
diaktifkan, Anda tidak perlu semua itu. 2. Anda tidak perlutext
daneol=lf
.eol=lf
set secara efektiftext
.* text=auto eol=lf
yang pertamatext=auto
ditimpa oleheol=lf
. Di mana Anda menemukan fitur ini? Inilah sumber saya: stackoverflow.com/questions/29435156/…* text=auto eol=lf
dari contoh, karena dihapus dari Drupal juga. Pertimbangkan juga untuk menghapus komentar.