Prosedur saya untuk berurusan dengan akhir baris adalah sebagai berikut (pertempuran diuji pada banyak repo):
Saat membuat repo baru:
- masukkan
.gitattributes
komit pertama bersama dengan file khas lainnya seperti .gitignore
danREADME.md
Saat berurusan dengan repo yang ada:
- Buat / modifikasi
.gitattributes
sesuai
git commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
( --no-verify
adalah untuk melewatkan kait pra-komit)
- Saya harus cukup sering melakukannya sehingga saya mendefinisikannya sebagai alias
alias fixCRLF="..."
- ulangi perintah sebelumnya
- ya, itu voodoo, tetapi umumnya saya harus menjalankan perintah dua kali, pertama kali itu menormalkan beberapa file, kedua kali bahkan lebih banyak file. Secara umum mungkin yang terbaik adalah mengulangi sampai tidak ada komit baru dibuat :)
- bolak-balik antara yang lama (sesaat sebelum normalisasi) dan cabang baru beberapa kali. Setelah berpindah cabang, terkadang git akan menemukan lebih banyak file yang perlu dinormalisasi ulang!
Dalam .gitattributes
I menyatakan semua file teks secara eksplisit memiliki LF EOL karena umumnya Windows tooling kompatibel dengan LF sementara non-Windows tooling tidak kompatibel dengan CRLF (bahkan banyak alat baris perintah nodejs menganggap LF dan karenanya dapat mengubah EOL dalam file Anda).
Isi dari .gitattributes
.gitattributes
Biasanya saya terlihat seperti:
*.html eol=lf
*.js eol=lf
*.json eol=lf
*.less eol=lf
*.md eol=lf
*.svg eol=lf
*.xml eol=lf
Untuk mengetahui ekstensi berbeda apa yang dilacak oleh git di repo saat ini, lihat di sini
Masalah setelah normalisasi
Setelah ini selesai, ada satu peringatan lagi yang umum.
Katakanlah Anda master
sudah mutakhir dan dinormalisasi, lalu Anda checkout outdated-branch
. Cukup sering setelah memeriksa cabang itu, git menandai banyak file yang dimodifikasi.
Solusinya adalah dengan melakukan commit palsu ( git add -A . && git commit -m 'fake commit'
) lalu git rebase master
. Setelah rebase, komit palsu harus pergi.