Hampir empat tahun setelah mengajukan pertanyaan ini, saya akhirnya menemukan jawaban yang benar-benar memuaskan saya !
Lihat detail di github: panduan bantuan untuk
Berurusan dengan akhiran baris .
Git memungkinkan Anda untuk mengatur properti akhiran baris untuk repo secara langsung menggunakan atribut teks dalam
.gitattributes
file. File ini dikomit ke dalam repo dan mengesampingkan core.autocrlf
pengaturan, memungkinkan Anda untuk memastikan perilaku yang konsisten untuk semua pengguna terlepas dari pengaturan git mereka.
Dan dengan demikian
Keuntungan dari hal ini adalah bahwa konfigurasi end of line Anda sekarang bepergian dengan repositori Anda dan Anda tidak perlu khawatir tentang apakah kolaborator memiliki pengaturan global yang tepat atau tidak.
Ini contoh .gitattributes
file
# Auto detect text files and perform LF normalization
* text=auto
*.cs text diff=csharp
*.java text diff=java
*.html text diff=html
*.css text
*.js text
*.sql text
*.csproj text merge=union
*.sln text merge=union eol=crlf
*.docx diff=astextplain
*.DOCX diff=astextplain
# absolute paths are ok, as are globs
/**/postinst* text eol=lf
# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol=lf
Ada koleksi nyaman .gitattributes file siap pakai untuk bahasa pemrograman paling populer. Ini berguna untuk membantu Anda memulai.
Setelah membuat atau menyesuaikan .gitattributes
, Anda harus melakukan normalisasi ulang akhiran garis sekali dan untuk semua .
Perhatikan bahwa aplikasi GitHub Desktop dapat menyarankan dan membuat .gitattributes
file setelah Anda membuka repo Git proyek Anda di aplikasi. Untuk mencobanya, klik ikon roda gigi (di sudut kanan atas)> Pengaturan repositori ...> Akhiran garis dan atribut. Anda akan diminta untuk menambahkan yang direkomendasikan .gitattributes
dan jika Anda setuju, aplikasi juga akan melakukan normalisasi semua file di repositori Anda.
Akhirnya, artikel Mind the End of Your Line memberikan lebih banyak latar belakang dan menjelaskan bagaimana Git telah berevolusi dalam masalah yang dihadapi. Saya menganggap ini bacaan wajib .
Anda mungkin memiliki pengguna di tim Anda yang menggunakan EGit atau JGit (alat seperti Eclipse dan TeamCity menggunakannya) untuk melakukan perubahan. Maka Anda kurang beruntung, seperti yang dijelaskan @gatinueta dalam komentar jawaban ini:
Pengaturan ini tidak akan memuaskan Anda sepenuhnya jika Anda memiliki orang yang bekerja dengan Egit atau JGit di tim Anda, karena alat tersebut hanya akan mengabaikan .gitattributes dan dengan senang hati memeriksa file CRLF https://bugs.eclipse.org/bugs/show_bug.cgi? id = 342372
Salah satu trik mungkin untuk meminta mereka melakukan perubahan pada klien lain, katakan SourceTree . Tim kami saat itu lebih suka alat itu daripada Eclipse's EGit untuk banyak kasus penggunaan.
Siapa bilang perangkat lunak itu mudah? : - /
.gitattributes
?.gitattributes
disarankan GitHub untuk Windows untuk proyek Anda? Saya menginstal GitHub untuk Windows, memulai versi GUI dan tidak dapat menemukan opsi yang terkait dengan.gitattributes
saran.core.autocrlf = false
- saya lebih suka LF di mana-mana, tetapi beberapa alat Windows seperti Visual Studio bersikeras akhir CRLF dalam file tertentu (dan bahkan mencampurnya dalam beberapa ..); bukan akhiran garis hijau adalah pilihan paling aman. Jika Anda tahu apa yang Anda lakukan, saya mungkin akan menggunakancore.autocrlf = input
dan membuat pengecualian untuk proyek-proyek di Windows yang Anda tahu sensitif terhadap akhir baris. Seperti yang ditunjukkan orang lain, setiap editor teks yang layak mendukung akhiran LF sekarang. Saya benar-benar berpikircore.autocrlf = true
mungkin dapat menyebabkan lebih banyak masalah daripada mencegahnya.Jangan mengonversi ujung baris. Bukan tugas VCS untuk menginterpretasikan data - simpan saja dan beri versi. Setiap editor teks modern dapat membaca kedua jenis akhiran baris itu.
sumber
Anda hampir selalu ingin
autocrlf=input
kecuali Anda benar-benar tahu apa yang Anda lakukan.Beberapa konteks tambahan di bawah ini:
Paragraf di atas pada awalnya ditarik dari utas di gmane.org, tetapi sejak saat itu sudah turun.
sumber
core.autocrlf=input
adalah jawaban kanonik. Untuk sebagian besar kasus penggunaan,core.autocrlf=true
dancore.autocrlf=false
terlalu bersemangat (... dalam cara yang berlawanan tetapi sama-sama mengerikan, tentu saja) dan karenanya secara intrinsik merusak. "Git for Windows" seharusnya benar - benar dikirimkan dengan "Checkout apa adanya, komit akhiran garis gaya Unix" (yaitu,core.autocrlf=input
) sebagai strategi default baris baru. Tidak. Jadi di sini kita di sini - di awal 2015 - masih berdebat tanpa henti.Dua strategi alternatif untuk menjadi konsisten tentang garis akhir di lingkungan campuran (Microsoft + Linux + Mac):
A. Global per Semua Pengaturan Repositori
1) Konversi semua menjadi satu format
2) Set
core.autocrlf
keinput
Linux / UNIX atautrue
MS Windows (repositori atau global)3) [Opsional] disetel
core.safecrlf
ketrue
(untuk berhenti) atauwarn
(untuk menyanyi :) untuk menambahkan penjaga ekstra membandingkan jika transformasi baris baru yang dibalik akan menghasilkan file yang samaB. Atau per Pengaturan Repositori
1) Konversi semua menjadi satu format
2) tambahkan
.gitattributes
file ke repositori AndaJangan khawatir tentang file biner Anda - Git harus cukup pintar tentang mereka.
Lebih lanjut tentang variabel safecrlf / autocrlf
sumber
dos2unix
adalah alat baris perintah yang bergantung pada sistem yang mungkin harus Anda instal tambahandos2unix
- ada risiko rusak.git/index
dan kita tidak perlu menerapkannya pada setiap file. Lebih baik menggunakan sesuatu sepertifind ./ -name "*.html"
dan menentukan file yang ingin Anda terapkan.find
, berhati-hatilah:dos2unix
yang dikirimkan bersama dengan Git untuk Windows memiliki perilaku aneh (IMO idiot dan berbahaya), tanpa argumen: alih-alih mengubah ke UNIX, ia mengubah format baris baru (DOS <-> UNIX )Coba
core.autocrlf
atur opsi konfigurasi ketrue
. Lihat jugacore.safecrlf
opsi.Sebenarnya sepertinya
core.safecrlf
sudah diatur dalam repositori Anda, karena (penekanan milikku):Jika ini masalahnya, maka Anda mungkin ingin memeriksa apakah editor teks Anda dikonfigurasi untuk menggunakan akhiran baris secara konsisten. Anda mungkin akan mengalami masalah jika file teks berisi campuran ujung LF dan CRLF.
Akhirnya, saya merasa bahwa rekomendasi untuk hanya "menggunakan apa yang Anda diberikan" dan menggunakan jalur yang diakhiri LF pada Windows akan menyebabkan lebih banyak masalah daripada yang dipecahkan. Git memiliki opsi di atas untuk mencoba menangani ujung garis dengan cara yang masuk akal, jadi masuk akal untuk menggunakannya.
sumber
Menggunakan
core.autocrlf=false
menghentikan semua file yang ditandai diperbarui segera setelah saya memeriksanya di Visual Studio 2010 saya proyek . Dua anggota tim pengembangan lainnya juga menggunakan sistem Windows sehingga lingkungan campuran tidak ikut bermain, namun pengaturan default yang disertakan dengan repositori selalu menandai semua file yang diperbarui segera setelah kloning.Saya kira intinya adalah menemukan apa yang berfungsi pengaturan CRLF untuk lingkungan Anda. Terutama karena di banyak repositori lain di pengaturan kotak Linux kami
autocrlf = true
menghasilkan hasil yang lebih baik.20+ tahun kemudian dan kami masih berurusan dengan perbedaan garis akhir antara OS ... sedih.
sumber
Ini adalah dua opsi untuk pengguna Windows dan Visual Studio yang berbagi kode dengan pengguna Mac atau Linux . Untuk penjelasan lebih lanjut, baca manual gitattributes .
* text = auto
Dalam
.gitattributes
file repo Anda, tambahkan:Ini akan menormalkan semua file dengan
LF
akhiran baris dalam repo.Dan tergantung pada sistem operasi Anda (
core.eol
pengaturan), file di pohon kerja akan dinormalisasi keLF
untuk sistem berbasis Unix atauCRLF
untuk sistem Windows.Ini adalah konfigurasi yang Microsoft .NET menggunakan repo .
Contoh:
Akan dinormalisasi dalam repo selalu seperti:
Saat checkout, pohon yang berfungsi di Windows akan dikonversi menjadi:
Saat checkout, pohon yang berfungsi di Mac akan dibiarkan sebagai:
core.autocrlf = benar
Jika
text
tidak ditentukan dalam.gitattributes
file, Git menggunakancore.autocrlf
variabel konfigurasi untuk menentukan apakah file tersebut harus dikonversi.Untuk pengguna Windows,
git config --global core.autocrlf true
adalah pilihan yang bagus karena:LF
akhir baris hanya bila ditambahkan ke repo. Jika ada file yang tidak dinormalisasi dalam repo, pengaturan ini tidak akan menyentuhnya.CRLF
akhir baris di direktori kerja.Masalah dengan pendekatan ini adalah:
autocrlf = input
, Anda akan melihat banyak file denganLF
akhiran baris. Bukan bahaya bagi anggota tim lainnya, karena komit Anda masih akan dinormalisasi denganLF
akhiran garis.core.autocrlf = false
, Anda akan melihat banyak file denganLF
akhiran baris dan Anda dapat memperkenalkan file denganCRLF
ujung baris ke dalam repo.autocrlf = input
dan mungkin mendapatkan file denganCRLF
ujung file, mungkin dari pengguna Windows dengancore.autocrlf = false
.sumber
git config --global core.autocrl true
. Maksudmugit config --global core.autocrlf true
.--- UPDATE 3 --- (tidak bertentangan dengan UPDATE 2)
Mempertimbangkan kasus bahwa pengguna windows lebih suka bekerja
CRLF
dan pengguna linux / mac lebih suka bekerja padaLF
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 memilihcore.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:.git/
sub-direktori dengan akhir baris dikonversi (tergantung padacore.autocrlf
nilai pada konfigurasi klien Anda). Semua ini dilakukan secara lokal.core.autocrlf
seperti memberikan jawaban untuk pertanyaan (pertanyaan yang sama persis pada semua OS):false:
" Jangan lakukan yang di atas ",input:
" lakukan saja b "true
: " lakukan a dan dan b "Untung
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:
core.autocrlf
nilaicore.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 menyimpan
git.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: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:
core.autocrlf=true
berarti mengonversi baris ke CRLF saat checkout dan mengonversi baris ke LF saat menambahkan file.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 adalahfalse
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.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:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Catatan: pada klien windows hanya bekerja melaluigit-bash
dan pada klien linux hanya jika dikompilasi menggunakan--with-libpcre
di./configure
).core.autocrlf=input
( --- perbarui 3 - ).gitattributes
core.autocrlf
dijelaskan di atas ke nilai standarnya..gitattributes
. git-klien IDE mungkin mengabaikannya atau memperlakukannya secara berbeda.Seperti yang dikatakan beberapa hal dapat ditambahkan dalam atribut git:
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 .klien windows / linux:
core.autocrlf=input
berkomitmen
.gitattributes
:* text=auto eol=lf
berkomitmen
.editorconfig
( http://editorconfig.org/ ) yang merupakan jenis format standar, dikombinasikan dengan plugin editor:https://github.com/welovecoding/editorconfig-netbeans/sumber
.gitattributes
baris Anda , ia memiliki conseque yang tidak disengaja di Git <2.10, lihat stackoverflow.com/a/29508751/2261442git config --global core.autocrlf false
, dan merekomendasikan untuk berurusan dengan eol dalam.gitattributes
arahan saja.Ini hanyalah solusi penyelesaian masalah:
Dalam kasus normal, gunakan solusi yang dikirimkan bersama git. Ini bekerja dengan baik dalam banyak kasus. Paksakan LF jika Anda berbagi pengembangan pada sistem berbasis Windows dan Unix dengan menetapkan .gitattributes .
Dalam kasus saya ada> 10 programmer yang mengembangkan proyek di Windows. Proyek ini diperiksa dengan CRLF dan tidak ada opsi untuk memaksa ke LF.
Beberapa pengaturan ditulis secara internal di mesin saya tanpa pengaruh pada format LF; sehingga beberapa file diubah secara global menjadi LF pada setiap perubahan file kecil.
Solusi saya:
Windows-Machines: Biarkan semuanya apa adanya. Tidak peduli dengan apa pun, karena Anda adalah pengembang default windows 'lone wolf' dan Anda harus menangani seperti ini: "Tidak ada sistem lain di dunia yang luas, bukan?"
Mesin Unix
Tambahkan baris berikut ke bagian konfigurasi
[alias]
. Perintah ini mencantumkan semua file yang diubah (yaitu dimodifikasi / baru):Ubah semua file yang diubah ke dalam format dos:
Opsional ...
Buat git hook untuk tindakan ini untuk mengotomatiskan proses ini
Gunakan params dan sertakan dan modifikasi
grep
fungsi untuk mencocokkan hanya nama file tertentu, misalnya:Jangan ragu untuk membuatnya lebih nyaman dengan menggunakan pintasan tambahan:
... dan jalankan barang yang dikonversi dengan mengetik
sumber