--- UPDATE 3 --- (tidak bertentangan dengan UPDATE 2)
Mempertimbangkan kasus bahwa pengguna windows lebih suka bekerja CRLF
dan pengguna linux / mac lebih suka bekerja pada LF
file teks. Memberikan jawaban dari perspektif pengelola repositori :
Bagi saya strategi terbaik (lebih sedikit masalah untuk dipecahkan) adalah: simpan semua file teks dengan LF
git repo dalam walaupun Anda sedang mengerjakan proyek windows-only. Kemudian berikan kebebasan kepada klien untuk mengerjakan gaya penutup akhir dari preferensi mereka , asalkan mereka memilih core.autocrlf
nilai properti yang akan menghormati strategi Anda (LF on repo) sambil mengatur file untuk komit.
Pementasan adalah yang membingungkan banyak orang ketika mencoba memahami bagaimana strategi garis baru bekerja. Sangat penting untuk menghilangkan poin-poin berikut sebelum memilih nilai yang benar untuk core.autocrlf
properti:
- Menambahkan file teks untuk komit ( staging ) adalah seperti menyalin file ke tempat lain di dalam
.git/
sub-direktori dengan akhir baris dikonversi (tergantung pada core.autocrlf
nilai pada konfigurasi klien Anda). Semua ini dilakukan secara lokal.
- pengaturan
core.autocrlf
seperti memberikan jawaban untuk pertanyaan (pertanyaan yang sama persis pada semua OS):
- "Haruskah git-client a. Mengkonversi LF-ke-CRLF saat check-out (menarik) repo berubah dari jarak jauh atau b. Mengkonversi CRLF-ke-LF ketika menambahkan file untuk komit? " Dan kemungkinan jawaban (nilai) adalah:
false:
" Jangan lakukan yang di atas ",
input:
" lakukan saja b "
true
: " lakukan a dan dan b "
- perhatikan bahwa TIDAK ada " lakukan saja "
Untung
- git client default (windows
core.autocrlf: true
:, linux / mac:)
core.autocrlf: false
akan kompatibel dengan strategi LF-only-repo .
Artinya : klien windows secara default akan mengkonversi ke CRLF ketika memeriksa-keluar repositori dan mengkonversi ke LF ketika menambahkan untuk komit. Dan klien linux secara default tidak akan melakukan konversi. Secara teoritis ini hanya menyimpan repo Anda.
Sayangnya:
- Mungkin ada GUI klien yang tidak menghormati git
core.autocrlf
nilai
- Mungkin ada orang yang tidak menggunakan nilai untuk menghargai strategi lf-repo Anda. Misalnya mereka gunakan
core.autocrlf=false
dan menambahkan file dengan CRLF untuk komit.
Untuk mendeteksi file teks non-Jika ASAP dilakukan oleh klien di atas, Anda dapat mengikuti apa yang dijelaskan pada --- pembaruan 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
, pada klien yang dikompilasi menggunakan:--with-libpcre
flag)
Dan di sini adalah menangkap: . Saya sebagai pengelola repo menyimpangit.autocrlf=input
sehingga saya dapat memperbaiki file yang salah komitmen hanya dengan menambahkannya lagi untuk komit. Dan saya memberikan teks komit: "Memperbaiki file yang salah berkomitmen".
Sejauh .gitattributes
ini dinodai. Saya tidak mengandalkan itu, karena ada lebih banyak klien yang tidak memahaminya. Saya hanya menggunakannya untuk memberikan petunjuk untuk file teks dan file biner, dan mungkin menandai beberapa file luar biasa yang di mana-mana harus menyimpan akhiran baris yang sama:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
Pertanyaan: Tapi mengapa kita tertarik sama sekali dalam strategi penanganan baris baru?
Jawaban: Untuk menghindari komit perubahan huruf tunggal, muncul sebagai perubahan 5.000 baris , hanya karena klien yang melakukan perubahan secara otomatis mengonversi file lengkap dari crlf ke lf (atau sebaliknya) sebelum menambahkannya untuk komit. Ini bisa agak menyakitkan ketika ada resolusi konflik yang terlibat. Atau bisa dalam beberapa kasus menjadi penyebab konflik yang tidak masuk akal.
--- PEMBARUAN 2 ---
Kerusakan klien git akan berfungsi dalam banyak kasus. Bahkan jika Anda hanya memiliki klien windows only, linux hanya klien atau keduanya. Ini adalah:
- windows:
core.autocrlf=true
berarti mengonversi baris ke CRLF saat checkout dan mengonversi baris ke LF saat menambahkan file.
- linux:
core.autocrlf=input
berarti tidak mengkonversi baris pada checkout (tidak perlu karena file diharapkan dilakukan dengan LF) dan mengkonversi baris ke LF (jika perlu) saat menambahkan file. ( - update3 - : Tampaknya ini adalah false
default, tapi sekali lagi tidak masalah)
Properti dapat diatur dalam cakupan yang berbeda. Saya akan menyarankan pengaturan secara eksplisit dalam --global
ruang lingkup, untuk menghindari beberapa masalah IDE yang dijelaskan di bagian akhir.
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
Juga saya akan sangat menyarankan menggunakan pada windows git config --global core.autocrlf false
(jika Anda memiliki klien windows saja) berbeda dengan apa yang diusulkan untuk dokumentasi git . Pengaturan ke false akan melakukan file dengan CRLF di repo. Tetapi sebenarnya tidak ada alasan. Anda tidak pernah tahu apakah Anda perlu berbagi proyek dengan pengguna linux. Plus itu satu langkah ekstra untuk setiap klien yang bergabung dengan proyek daripada menggunakan default.
Sekarang untuk beberapa kasus khusus file (mis. *.bat
*.sh
) Yang Anda ingin mereka periksa dengan LF atau dengan CRLF Anda dapat menggunakan.gitattributes
Singkatnya bagi saya praktik terbaik adalah:
- Pastikan bahwa setiap file non-biner dikomit dengan LF on git repo (perilaku default).
- Gunakan perintah ini untuk memastikan bahwa tidak ada file yang dikomit dengan CRLF:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Catatan: pada klien windows hanya bekerja melalui git-bash
dan pada klien linux hanya jika dikompilasi menggunakan --with-libpcre
di./configure
).
- Jika Anda menemukan file seperti itu dengan menjalankan perintah di atas, perbaiki. Ini melibatkan (setidaknya di linux):
- set
core.autocrlf=input
( --- perbarui 3 - )
- ubah file
- Kembalikan perubahan (file masih ditampilkan sebagai diubah)
- lakukan itu
- Gunakan hanya minimum
.gitattributes
- Instruksikan pengguna untuk mengatur yang
core.autocrlf
dijelaskan di atas ke nilai standarnya.
- Jangan hitung 100% jika ada
.gitattributes
. git-klien IDE mungkin mengabaikannya atau memperlakukannya secara berbeda.
Seperti yang dikatakan beberapa hal dapat ditambahkan dalam atribut git:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
Saya pikir beberapa opsi aman lainnya .gitattributes
daripada menggunakan deteksi otomatis untuk file biner:
-text
(mis. untuk *.zip
atau *.jpg
file: Tidak akan diperlakukan sebagai teks. Dengan demikian tidak ada konversi akhir baris akan dicoba. Diff mungkin dilakukan melalui program konversi)
text !eol
(misalnya untuk *.java
, *.html
:.. Diperlakukan sebagai teks, tapi preferensi gaya eol tidak diatur Jadi pengaturan klien digunakan)
-text -diff -merge
(mis. untuk *.hugefile
: Tidak diperlakukan sebagai teks. Tidak ada perbedaan / penggabungan)
--- PEMBARUAN SEBELUMNYA ---
Salah satu contoh menyakitkan klien yang akan melakukan file salah:
netbeans 8.2 (di windows), akan salah melakukan semua file teks dengan CRLF, kecuali Anda telah secara eksplisit ditetapkan core.autocrlf
sebagai global . Ini bertentangan dengan perilaku klien standar git, dan menyebabkan banyak masalah kemudian, saat memperbarui / menggabungkan. Inilah yang membuat beberapa file tampak berbeda (meskipun tidak) bahkan ketika Anda kembali .
Perilaku yang sama di netbeans terjadi bahkan jika Anda telah menambahkan yang benar.gitattributes
untuk proyek Anda.
Menggunakan perintah berikut setelah komit, setidaknya akan membantu Anda mendeteksi lebih awal apakah repo git Anda memiliki masalah akhir baris: git grep -I --files-with-matches --perl-regexp '\r' HEAD
Saya telah menghabiskan waktu berjam-jam untuk menggunakan sebaik mungkin .gitattributes
, untuk akhirnya menyadari, bahwa saya tidak dapat mengandalkannya.
Sayangnya, selama editor berbasis JGit ada (yang tidak dapat menangani .gitattributes
dengan benar), solusi yang aman adalah dengan memaksa LF di mana-mana bahkan pada tingkat editor.
Gunakan anti-CRLF
desinfektan berikut .
.gitattributes
?