git mengganti LF dengan CRLF


840

Menjalankan git pada mesin Windows XP, menggunakan bash. Saya mengekspor proyek saya dari SVN, dan kemudian mengkloning repositori kosong.

Saya kemudian menempelkan ekspor ke direktori repositori kosong, dan melakukan:

git add -A

Saya kemudian mendapat daftar pesan yang mengatakan:

LF akan digantikan oleh CRLF

Apa konsekuensi dari pertobatan ini? Ini adalah solusi .NET di Visual Studio.


14
@apphacker karena menstandarisasi akhir baris tidak terlalu menjengkelkan daripada harus mengubahnya sendiri saat membuat dua file berbeda. (Dan tentu saja, jika Anda tidak setuju, maka Anda dapat menonaktifkan fitur core.autocrlf).
RJFalconer

2
mengapa ujung garis akan berbeda kecuali seluruh garis tersentuh
Bjorn

3
Saya sering menyentuh banyak baris, karena saya bereksperimen dengan ide-ide yang berbeda, menambahkan jejak pernyataan untuk melihat bagaimana mereka bekerja, dll. Kemudian saya mungkin ingin hanya melakukan perubahan ke dua atau tiga baris dan git sepenuhnya mengabaikan yang lain karena saya telah menempatkan mereka kembali seperti yang saya temukan (atau jadi saya pikir).
MatrixFrog

5
@MatrixFrog: editor Anda tampaknya rusak, tidak dapat mendeteksi ujung jalur secara otomatis. Yang mana itu? Saya bekerja pada proyek hybrid yang harus memiliki beberapa file LF dan beberapa file CRLF lainnya dalam repo yang sama. Tidak masalah bagi editor modern mana pun. Memiliki kontrol versi (atau transfer file) yang berantakan dengan garis akhir untuk mengatasi keterbatasan editor adalah ide terburuk yang pernah - jelas dari hanya panjang penjelasan di bawah ini.
MarcH

4
Satu-satunya editor modern yang saya tahu yang melakukan hal yang salah adalah Visual Studio. Visual Studio akan dengan senang hati membuka file dengan akhiran garis LF. Jika Anda kemudian memasukkan baris baru, itu akan menyisipkan CRLF, dan menyimpan akhir baris campuran. Microsoft menolak untuk memperbaikinya, yang merupakan cacat yang cukup besar pada IDE yang dinyatakan cukup baik: - (
Jon Watte

Jawaban:


957

Pesan-pesan ini disebabkan oleh nilai default yang salah core.autocrlfpada Windows.

Konsepnya autocrlfadalah untuk menangani konversi akhir baris secara transparan. Dan itu benar!

Berita buruk : nilai harus dikonfigurasi secara manual.
Berita bagus : itu hanya boleh dilakukan SATU kali per instalasi git (per pengaturan proyek juga mungkin).

Bagaimana cara autocrlfkerjanya :

core.autocrlf=true:      core.autocrlf=input:     core.autocrlf=false:

        repo                     repo                     repo
      ^      V                 ^      V                 ^      V
     /        \               /        \               /        \
crlf->lf    lf->crlf     crlf->lf       \             /          \      
   /            \           /            \           /            \

Di sini crlf= penanda end-of-line win-style, lf= unix-style (dan mac osx).

(pre-osx crin tidak terpengaruh untuk salah satu dari tiga opsi di atas)

Kapan peringatan ini muncul (di bawah Windows)

    - autocrlf= truejika Anda memiliki gaya unix lfdi salah satu file Anda (= Jarang),
    - autocrlf= inputjika Anda memiliki gaya menang crlfdi salah satu file Anda (= hampir SELALU),
    - autocrlf= false- TIDAK PERNAH!

Apa artinya peringatan ini

Peringatan " LF akan digantikan oleh CRLF " mengatakan bahwa Anda (memiliki autocrlf= true) akan kehilangan LF gaya unix Anda setelah siklus commit-checkout (ini akan digantikan oleh CRLF gaya windows). Git tidak mengharapkan Anda untuk menggunakan LF unix-style di bawah windows.

Peringatan " CRLF akan digantikan oleh LF " mengatakan bahwa Anda (memiliki autocrlf= input) akan kehilangan CRLF gaya-windows setelah siklus komit-checkout (akan diganti dengan LF unix-style). Jangan gunakan di inputbawah windows.

Namun cara lain untuk menunjukkan cara autocrlfkerjanya

1) true:             x -> LF -> CRLF
2) input:            x -> LF -> LF
3) false:            x -> x -> x

di mana x adalah CRLF (gaya windows) atau LF (gaya unix) dan panah mewakili

file to commit -> repository -> checked out file

Bagaimana cara memperbaiki

Nilai default untuk core.autocrlfdipilih selama instalasi git dan disimpan dalam gitconfig ( %ProgramFiles(x86)%\git\etc\gitconfig) seluruh sistem ( ). Juga ada (mengalir dalam urutan berikut):

   - gitconfig "global" (per-pengguna) terletak di ~/.gitconfig, gitconfig
   "global" (per-pengguna) lain di $XDG_CONFIG_HOME/git/configatau $HOME/.config/git/configdan
   - " gitconfig " lokal "(per-repo) di .git/configdalam direktori kerja.

Jadi, tulis git config core.autocrlfdi dir yang berfungsi untuk memeriksa nilai yang saat ini digunakan dan

   - tambahkan autocrlf=falseke solusi gitconfig # per-sistem di seluruh sistem
   - git config --global core.autocrlf false            # solusi per pengguna
   - git config --local core.autocrlf false              # solusi per proyek

Peringatan
- git configpengaturan dapat ditimpa oleh gitattributespengaturan.
- crlf -> lfKonversi hanya terjadi ketika menambahkan file baru, crlffile yang sudah ada di repo tidak terpengaruh.

Moral (untuk Windows):
    - use core.autocrlf= truejika Anda berencana untuk menggunakan proyek ini di bawah Unix juga (dan tidak mau mengkonfigurasi editor / IDE Anda untuk menggunakan ujung garis unix),
    - use core.autocrlf= falsejika Anda berencana untuk menggunakan proyek ini di bawah Windows saja ( atau Anda telah mengkonfigurasi editor / IDE Anda untuk menggunakan akhiran baris unix),
    - tidak pernah menggunakan core.autocrlf= inputkecuali Anda memiliki alasan yang baik untuk ( misalnya jika Anda menggunakan utilitas unix di bawah windows atau jika Anda mengalami masalah makefiles),

PS Apa yang harus dipilih ketika menginstal git untuk Windows?
Jika Anda tidak akan menggunakan salah satu proyek Anda di bawah Unix, jangan setuju dengan opsi pertama default. Pilih yang ketiga ( Periksa apa adanya, komit apa adanya ). Anda tidak akan melihat pesan ini. Pernah.

PPS Preferensi pribadi saya adalah mengonfigurasi editor / IDE untuk menggunakan ujung Unix-style, dan pengaturan core.autocrlfke false.


28
Untuk jumlah waktu yang saya habiskan untuk mencapai sejauh ini, saya berharap untuk core.crlf = rackoff ;-)
PandaWood

10
Saya merestrukturisasi kontennya, mungkin akan lebih mudah untuk membaca dengan cara ini
Antony Hatchkins

7
maaf, saya harap komentar saya tidak dianggap sebagai kritik atas jawaban Anda. Maksud saya "sejauh ini" maksud saya, sebelum menemukan jawaban ini.
PandaWood

10
Ini sangat membingungkan. Saya memiliki LF di editor saya. Semua kode repo menggunakan LF. global autocrlf disetel ke false dan gitconfig inti di direktori home saya disetel ke false. Tapi saya masih mendapatkan pesan LF digantikan dengan CRLF
isimmons

17
Jika Anda telah mengkonfigurasi editor Anda untuk menggunakan ujung gaya Unix, mengapa tidak mengatur core.autocrlfuntuk memasukkan? Dari apa yang saya kumpulkan dari jawaban Anda, mengaturnya ke input memastikan repositori dan direktori kerja selalu memiliki akhiran gaya baris unix. Mengapa Anda tidak menginginkannya di Windows?
Hubro

764

Git memiliki tiga mode bagaimana memperlakukan ujung baris:

$ git config core.autocrlf
# that command will print "true" or "false" or "input"

Anda dapat mengatur mode untuk digunakan dengan menambahkan parameter tambahan trueatau falseke baris perintah di atas.

Jika core.autocrlfdisetel ke true, itu berarti bahwa setiap kali Anda menambahkan file ke repo git yang menurut git adalah file teks, itu akan mengubah semua akhiran garis CRLF menjadi hanya LF sebelum disimpan dalam komit. Setiap kali Anda melakukan git checkoutsesuatu, semua file teks secara otomatis akan memiliki ujung LF mereka dikonversi ke ujung CRLF. Hal ini memungkinkan pengembangan proyek lintas platform yang menggunakan gaya akhir baris yang berbeda tanpa komit menjadi sangat bising karena setiap editor mengubah gaya akhir baris karena gaya akhir baris selalu konsisten LF.

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 dalam kasus git salah menilai file biner menjadi file teks, itu adalah peringatan penting karena git kemudian akan merusak file biner Anda.

Jika core.autocrlfdisetel ke false, tidak ada konversi akhir baris yang pernah dilakukan, jadi file teks diperiksa apa adanya. Ini biasanya berfungsi dengan baik, selama semua pengembang Anda berada di Linux atau semua di Windows. Namun dalam pengalaman saya, saya masih cenderung mendapatkan file teks dengan ujung garis campuran yang akhirnya menyebabkan masalah.

Preferensi pribadi saya adalah membiarkan pengaturannya AKTIF, sebagai pengembang Windows.

Lihat http://kernel.org/pub/software/scm/git/docs/git-config.html untuk info terbaru yang menyertakan nilai "input".


116
Seperti yang dikatakan di sini ( stackoverflow.com/questions/1249932/… ), saya dengan hormat tidak setuju dan membiarkan pengaturan itu menjadi OFF (dan menggunakan Notepad ++ atau editor lain yang dapat menangani - dan biarkan apa adanya - karakter garis akhir apa pun) ia menemukan)
VonC

23
Saya suka jawaban ini, dan lebih suka membiarkan autocrlf di set true. Sebagai alternatif, apakah ada cara untuk membunuh pesan peringatan secara otomatis?
Krisc

12
Akan lebih baik untuk menambah jawaban yang ditulis dengan baik ini dengan perbandingan pada core.eolpengaturan, mungkin bersamaan dengan .gitattributeskonfigurasi. Saya sudah mencoba mencari tahu perbedaan dan tumpang tindih melalui eksperimen, dan ini sangat membingungkan.
seh

5
Untuk solusi yang lebih permanen, ubah .gitconfig Anda menjadi: [core] autocrlf = false
RBZ

9
Apakah ada cara mudah untuk memadamkan peringatan? Saya ingin itu benar dan tahu bahwa saya telah menetapkannya menjadi benar. Saya tidak perlu melihat semua peringatan setiap saat ... Tidak apa-apa, sungguh ...: p
UmaN

160

Jika Anda sudah memeriksa kode, file sudah diindeks. Setelah mengubah pengaturan git Anda, ucapkan dengan menjalankan:

git config --global core.autocrlf input 

Anda harus menyegarkan indeks dengan

git rm --cached -r . 

dan tulis ulang indeks git dengan

git reset --hard

https://help.github.com/articles/dealing-with-line-endings/#refreshing-a-repository-after-changing-line-endings

Catatan: ini akan menghapus perubahan lokal Anda, pertimbangkan menyimpannya sebelum Anda melakukan ini.


23
Terima kasih atas cara sederhana, lintas platform, yang jelas untuk MEMPERBAIKInya, daripada diskusi besar tentang makna konfigurasi.
Eris

2
jika git reset --mungkin perubahan lokal saya akan hilang? saya cukup ikuti semua komentar di atas
Freddy Sidauruk

5
Ya, perubahan lokal Anda akan hilang. Parameter --hard mengatur ulang indeks dan pohon kerja sehingga setiap perubahan pada file yang dilacak akan dibuang. git-scm.com/docs/git-reset
Jacques

2
Apa artinya git rm --cached -r .? Kenapa git reset --hardtidak cukup?
gavenkoa

2
@gavenkoa @max Anda memerlukan git rm --cached -r .Jika Anda melakukannya git reset --hardsetelah mengubah core.autocrlfpengaturan, itu tidak akan mengubah kembali akhir baris. Anda perlu membersihkan indeks git.
wisbucky

80
git config core.autocrlf false

6
pastikan untuk menjalankan ini di dalam root repositori
Hammad Khan

23
Saya tidak mengerti bagaimana ini bisa berguna. Separuh orang membutuhkan otokrasi agar benar agar bisa berfungsi, separuh lainnya membutuhkannya salah / input. Jadi, apa, mereka seharusnya secara acak melemparkan jawaban satu kali ini ke dinding konsol mereka sampai sesuatu menempel dan agak "berfungsi"? Ini tidak produktif.
Zoran Pavlovic

Saya mendapatkan kesalahan "fatal: not in a git directory". Saya mencoba untuk cd ke C: \ Program Files \ Git dan C: \ Program Files \ Git \ bin
pixelwiz

2
@ mbb pengaturan autcrlfuntuk falsehanya menyadap masalah ke setiap pengguna proyek Anda
jpaugh

5
@pixelwiz: perintah ini mengatur properti hanya untuk proyek (jadi Anda harus berada di bawah repositori git untuk menjalankannya). Jika Anda ingin mengatur ini secara global, gunakan git config --global core.autocrlf falsesaja.
Michaël Polla

49

Baik unix2dos dan dos2unix tersedia di windows dengan gitbash. Anda dapat menggunakan perintah berikut untuk melakukan konversi UNIX (LF) -> DOS (CRLF). Karenanya, Anda tidak akan mendapatkan peringatan.

unix2dos filename

atau

dos2unix -D filename

Tapi, jangan jalankan perintah ini pada file CRLF yang ada, maka Anda akan mendapatkan baris kosong setiap baris kedua.

dos2unix -D filenametidak akan bekerja dengan setiap sistem operasi. Silakan periksa tautan ini untuk kompatibilitas.

Jika karena alasan tertentu Anda perlu memaksa perintah kemudian gunakan --force. Jika dikatakan tidak valid maka gunakan -f.


8
Apa fungsinya?
Salman von Abbas

1
Inilah yang dikatakan opsi bantuan: `--u2d, -D melakukan UNIX -> konversi DOS`
Larry Battle

1
@ Rifat aku bingung. Komentar Anda mengatakan bahwa dos2unix -Dakan mengonversi ujung baris windows ke ujung baris linux. Bukankah itu sama dengan konversi DOS (CRLF) -> UNIX (LF). Namun dos2unix -hmenyatakan bahwa -Dakan melakukan konversi UNIX (LF) -> DOS (CRLF). dos2unix Info lebih lanjut: gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unix
Larry Battle

1
@ DarryBattle Ya, Anda benar tentang -D. Sebenarnya, saya memposting jawabannya ketika saya adalah pengguna windows. Dan, saya berkomentar lebih dari setahun kemudian ketika saya adalah pengguna mac: D BTW, Terima kasih atas klarifikasi.
Rifat

1
Ini berhasil untuk saya. Saya menggunakan Cygwin, yang sepertinya tidak mendukung saklar -D - tetapi ada perintah "unix2dos", yang melakukan hal yang sama. Saya berharap saya tahu apa yang menyebabkan masalah - saya punya core.autocrlf = false dan ini hanya repositori Windows.
Richard Beier

28

Saya pikir jawaban @ Basiloungas dekat tapi ketinggalan zaman (setidaknya pada Mac).

Buka file ~ / .gitconfig dan atur safecrlfke false

[core]
       autocrlf = input
       safecrlf = false

Itu * akan membuatnya mengabaikan end of line char rupanya (tetap bekerja untuk saya).


1
Seharusnya safecrlf(dengan 'f')
alpipego

22

Artikel GitHub tentang akhir baris umumnya disebutkan ketika berbicara tentang topik ini.

Pengalaman pribadi saya dengan menggunakan core.autocrlfpengaturan konfigurasi yang sering disarankan sangat beragam.

Saya menggunakan Windows dengan Cygwin, berurusan dengan proyek Windows dan UNIX pada waktu yang berbeda. Bahkan proyek Windows saya terkadang menggunakan bashskrip shell, yang membutuhkan akhiran baris UNIX (LF).

Menggunakan core.autocrlfpengaturan yang disarankan GitHub untuk Windows, jika saya memeriksa proyek UNIX (yang bekerja dengan baik di Cygwin - atau mungkin saya berkontribusi pada proyek yang saya gunakan di server Linux saya), file teks diperiksa dengan Windows (CRLF ) akhiran baris, menciptakan masalah.

Pada dasarnya, untuk lingkungan campuran seperti yang saya miliki, menetapkan global core.autocrlfke salah satu opsi tidak akan berfungsi dengan baik dalam beberapa kasus. Opsi ini mungkin diatur pada konfigurasi git lokal (repositori), tetapi bahkan itu tidak akan cukup baik untuk proyek yang berisi hal-hal yang berhubungan dengan Windows dan UNIX (misalnya saya memiliki proyek Windows dengan beberapa bashskrip utilitas).

Pilihan terbaik yang saya temukan adalah membuat file .gitattributes per-repositori . The Artikel GitHub menyebutkan itu.
Contoh dari artikel itu:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

Di salah satu repositori proyek saya:

* text=auto

*.txt         text eol=lf
*.xml         text eol=lf
*.json        text eol=lf
*.properties  text eol=lf
*.conf        text eol=lf

*.awk  text eol=lf
*.sed  text eol=lf
*.sh   text eol=lf

*.png  binary
*.jpg  binary

*.p12  binary

Ini sedikit lebih banyak hal untuk diatur, tetapi lakukan sekali per proyek, dan setiap kontributor pada OS apa pun seharusnya tidak memiliki masalah dengan akhir baris ketika bekerja dengan proyek ini.


Menjalankan ini sekarang, mencoba mengelola repo dengan skrip Cygwin antara file teks dasar lainnya. Bagaimana Anda menangani file tanpa ekstensi (mis. "Fstab", "sshd_config")? Artikel yang ditautkan tidak mencakup skenario itu.
Mike Loux


Saya menemukan bahwa text=false eol=falsebekerja agak mirip dengan binary. Apakah itu benar? Mungkin bermanfaat untuk menunjukkan "Saya tahu ini adalah file teks, tapi saya tidak ingin mereka dinormalisasi"
joeytwiddle

19

Dalam vim buka file (misalnya:) :e YOURFILEENTER, lalu

:set noendofline binary
:wq

2
Cukup mengedit dengan vimakan meninggalkan semua akhiran baris utuh.
Eye

Saya mengalami masalah dengan beberapa file Cocoapods. Di atas tetap sebagian besar dari mereka; untuk selebihnya, s / {control-v} {control-m} // melakukan triknya. Kedua kode kontrol bersama-sama membuat ^ M yang kita lihat di OS X sering terlihat di file Windows.
janineanne

16

Saya punya masalah ini juga.

SVN tidak melakukan konversi akhir baris, jadi file-file dikomit dengan akhiran CRLF utuh. Jika Anda kemudian menggunakan git-svn untuk meletakkan proyek ke git maka ujung CRLF tetap ada di dalam repositori git, yang bukan keadaan yang diharapkan git untuk menemukan dirinya sendiri - defaultnya adalah hanya memiliki akhiran baris unix / linux (LF) check in.

Ketika Anda kemudian memeriksa file di windows, konversi autocrlf membiarkan file tetap utuh (karena mereka sudah memiliki ujung yang benar untuk platform saat ini), namun proses yang memutuskan apakah ada perbedaan dengan file yang diperiksa melakukan konversi terbalik sebelum membandingkan, menghasilkan membandingkan apa yang dianggapnya adalah LF dalam file yang diperiksa dengan CRLF yang tidak terduga dalam repositori.

Sejauh yang saya lihat pilihan Anda adalah:

  1. Impor ulang kode Anda ke repositori git baru tanpa menggunakan git-svn, ini berarti akhiran baris akan dikonversi dalam komit git awal --semua
  2. Atur autocrlf menjadi false, dan abaikan fakta bahwa akhiran garis tidak sesuai dengan gaya git
  3. Periksa file Anda dengan nonaktif, perbaiki semua akhir baris, periksa semuanya kembali, dan hidupkan kembali.
  4. Tulis ulang riwayat repositori Anda sehingga komit asli tidak lagi berisi CRLF yang tidak diharapkan git. (Peringatan biasa tentang penulisan ulang sejarah berlaku)

Catatan Kaki: jika Anda memilih opsi # 2 maka pengalaman saya adalah bahwa beberapa alat pendukung (rebase, patch dll) tidak mengatasi file CRLF dan Anda akan cepat atau lambat menghasilkan file dengan campuran CRLF dan LF (garis tidak konsisten) akhir). Saya tahu tidak ada cara untuk mendapatkan yang terbaik dari keduanya.


2
Saya pikir ada opsi ke-4 untuk ditambahkan ke daftar Anda, dengan asumsi orang mampu menulis ulang sejarah: Anda dapat mengambil repo git yang awalnya Anda buat dengan git-svn, dan menulis ulang sejarahnya untuk tidak lagi memiliki umpan baris CRLF. Ini akan memberi Anda umpan garis dinormalisasi meluas ke belakang sepanjang seluruh sejarah svn Anda. Pengguna keo menyajikan satu solusi di stackoverflow.com/a/1060828/64257 .
Chris

Tentang catatan kaki Anda: rebasetidak ada masalah dengan CRLF. Satu-satunya masalah yang saya tahu adalah alat git merge standar akan menyisipkan penanda konfliknya ("<<<<<<", ">>>>>>" dll.) Dengan LF saja, jadi file dengan penanda konflik akan memiliki akhiran garis campuran. Namun, begitu Anda menghapus marker, semuanya baik-baik saja.
sleske

Mungkin penanganan git telah berubah dalam 3 tahun terakhir, ini adalah pengalaman langsung saya saat itu, saya tidak perlu meninjau kembali masalah khusus ini sejak itu. ymmv.
Tim Abell

1
@sleske mulai git 2.8, marker gabungan tidak akan lagi memperkenalkan akhiran campuran. Lihat stackoverflow.com/a/35474954/6309
VonC

@VonC: Itu keren. Baik untuk mengetahui saat-saat saya perlu bekerja di Windows.
sleske

12

Menghapus yang di bawah ini dari file ~ / .gitattributes

* text=auto

akan mencegah git dari memeriksa akhir baris di tempat pertama.


6
Salah. Baris itu, jika ada, akan menggantikan konfigurasi core.autocrlf. Jika itu disetel ke 'true', maka tidak, menghapus baris itu tidak akan mencegah git memeriksa akhir baris.
Arafangion

1
Meskipun demikian, jika core.autocrlf diatur ke false, jika yang ini tidak dihapus menetapkan autocrlf ke false tidak akan banyak membantu, jadi yang satu ini membantu saya (tetapi dengan sendirinya tidak cukup).
Matty

2
Putuskan ini !! Sementara bagian "akan mencegah git memeriksa" secara teknis tidak benar, ini adalah jawaban HANYA yang secara khusus menyebutkan text=pengaturan .gitattributessama sekali (yang, jika ada, AKAN menjadi pemblokir). Jadi jawaban lainnya tidak lengkap. Saya akan kacang sosok mencoba mengapa file saya terus muncul sebagai "dimodifikasi" tidak peduli berapa kali saya mengubah saya autocrlfdan safecrlfpengaturan & memeriksa & membersihkan git tembolok & hard reset.
jdunk

10

Itu harus membaca:

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

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

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


Ini juga berarti bahwa apa yang dikirim ke Subversion (jika Anda melakukannya) akan memiliki konversi.
jpaugh

10

http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/

echo "* -crlf" > .gitattributes 

Lakukan ini pada komit terpisah atau git mungkin masih melihat seluruh file telah dimodifikasi ketika Anda membuat perubahan tunggal (tergantung pada apakah Anda telah mengubah opsi autocrlf)

Ini benar-benar berfungsi. Git akan menghormati akhir baris dalam proyek akhir baris campuran dan tidak memperingatkan Anda tentang mereka.


2
Ini sangat berguna ketika Anda ingin mengkonversi antara CRLF dan LF, tetapi Anda memiliki beberapa file .sh yang harus tetap utuh. Saya menggunakan *.sh -crlfsemua waktu ...
MartinTeeVarga

9

Saya tidak tahu banyak tentang git di Windows, tapi ...

Muncul kepada saya bahwa git mengonversi format kembali agar sesuai dengan platform yang sedang berjalan (Windows). CRLF adalah format pengembalian default di Windows, sedangkan LF adalah format pengembalian default untuk sebagian besar OS lainnya.

Kemungkinannya, format pengembalian akan disesuaikan dengan benar ketika kode dipindahkan ke sistem lain. Saya juga berpendapat git cukup pintar untuk menjaga file biner tetap utuh daripada mencoba mengkonversi LF ke CRLF, katakanlah, JPEG.

Singkatnya, Anda mungkin tidak perlu terlalu khawatir tentang konversi ini. Namun, jika Anda pergi untuk mengarsipkan proyek Anda sebagai tarball, sesama pembuat kode mungkin akan lebih suka memiliki terminal LF daripada CRLF. Tergantung pada seberapa besar Anda peduli (dan tergantung pada Anda tidak menggunakan Notepad), Anda mungkin ingin mengatur git untuk menggunakan pengembalian LF jika Anda bisa :)

Lampiran: CR adalah kode ASCII 13, LF adalah kode ASCII 10. Jadi, CRLF adalah dua byte, sedangkan LF adalah satu.


5
Karena tampaknya tidak ada yang mengatakannya, CR adalah singkatan dari "Carriage Return" dan LF adalah singkatan dari "Line Feed". Sebagai catatan kedua, banyak editor windows akan diam-diam mengubah file teks dengan karakter LF yang menunjukkan baris baru sebagai gantinya menjadi pasangan karakter CRLF. Pengguna editor bahkan tidak akan diperingatkan, tetapi Git akan melihat perubahannya.
user2548343

7

Pastikan Anda telah menginstal git terbaru.
Saya melakukan seperti di atas git config core.autocrlf false, ketika menggunakan git (versi 2.7.1), tetapi tidak berhasil.
Maka itu berfungsi sekarang ketika memutakhirkan git (dari 2.7.1 ke 2.20.1).


Saya pikir Anda berarti Anda memiliki git 2.17.1. Saya mengalami masalah yang sama dan melakukan pembaruan dan ini memperbaikinya juga. Senang saya melihat jawaban Anda!
Phillip McMullen

5
  1. Buka file di Notepad ++.
  2. Pergi ke Edit / Konversi EOL.
  3. Klik ke Format Windows.
  4. Simpan file.

1
Coba juga gunakan git config --global core.autocrlf falseuntuk mencegah Git dari menetapkan akhir baris ke Unixpada komit. Tindak lanjuti dengan git config core.autocrlfmengeceknya memang disetel ke false.
Contango

5

Pertanyaan OP terkait windows dan saya tidak bisa menggunakan yang lain tanpa masuk ke direktori atau bahkan menjalankan file di Notepad ++ karena administrator tidak berfungsi .. Jadi harus melalui rute ini:

C:\Program Files (x86)\Git\etc>git config --global core.autocrlf false

3

Banyak editor teks memungkinkan Anda untuk berubah LF, lihat instruksi Atom di bawah ini. Sederhana dan eksplisit.


Klik CRLFdi kanan bawah:

masukkan deskripsi gambar di sini

Pilih LFdropdown di atas:

masukkan deskripsi gambar di sini


2

Dalam prompt shell GNU / Linux, perintah dos2unix & unix2dos memungkinkan Anda untuk dengan mudah mengkonversi / memformat file Anda yang berasal dari MS Windows


2

CRLF dapat menyebabkan beberapa masalah saat menggunakan "kode" Anda di dua OS yang berbeda (Linux dan Windows). Skrip python saya ditulis dalam wadah buruh pelabuhan Linux dan kemudian didorong menggunakan Windows git-bash. Itu memberi saya peringatan bahwa LF akan digantikan oleh CRLF. Saya tidak terlalu memikirkannya tetapi kemudian ketika saya memulai skrip nanti, katanya /usr/bin/env: 'python\r': No such file or directory. Sekarang \runtuk percabangan bagi Anda. Windows menggunakan "CR" - carriage return - di atas '\ n' sebagai karakter baris baru - \n\r. Itu sesuatu yang mungkin harus Anda pertimbangkan.


0

Sebagian besar alat di Windows hanya menerima LF dalam file teks. Sebagai contoh, Anda dapat mengontrol perilaku untuk Visual Studio dalam file bernama '.editorconfig' dengan konten contoh berikut (bagian):

 indent_style = space
 indent_size = 2
 end_of_line = lf    <<====
 charset = utf-8

Hanya Windows-Notepad asli yang tidak bekerja dengan LF tetapi ada beberapa alat editor sederhana yang lebih tepat tersedia!

Karenanya Anda harus menggunakan LF dalam file teks di Windows juga. Ini adalah pesan saya, sangat dianjurkan! Tidak ada alasan untuk menggunakan CRLF di windows!

(Diskusi yang sama menggunakan \ in include paths di C / ++, itu omong kosong, gunakan #include <pathTo / myheader.h> dengan slash !, Ini adalah standar C / ++ dan semua kompiler microsoft mendukungnya).

Maka pengaturan yang tepat untuk git adalah

git config core.autocrlf false

Pesan saya: Lupakan program berpikir lama seperti dos2unix dan unix2dos. Jelaskan dalam tim Anda bahwa LF layak digunakan di Windows.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.