Saya telah digigit oleh masalah akhir baris Windows / Linux dengan git. Tampaknya, melalui GitHub, MSysGit, dan sumber-sumber lain, bahwa solusi terbaik adalah mengatur repo lokal Anda untuk menggunakan akhiran garis gaya-linux, tetapi diatur core.autocrlf
ke true
. Sayangnya, saya tidak melakukan ini cukup awal, jadi sekarang setiap kali saya menarik perubahan, akhir baris borked.
Saya pikir saya telah menemukan jawaban di sini, tetapi saya tidak dapat membuatnya bekerja untuk saya. Pengetahuan Linux command line saya terbatas, jadi saya bahkan tidak yakin apa yang dilakukan oleh "xargs fromdos" dalam skripnya. Saya terus mendapatkan pesan tentang tidak ada file atau direktori seperti itu, dan ketika saya berhasil mengarahkannya ke direktori yang ada, ia memberi tahu saya bahwa saya tidak memiliki izin.
Saya sudah mencoba ini dengan MSysGit di Windows dan melalui terminal Mac OS X.
sumber
Jawaban:
Dokumentasi git untuk gitattributes sekarang mendokumentasikan pendekatan lain untuk "memperbaiki" atau menormalkan semua akhir baris dalam proyek Anda. Inilah intinya:
Ini memanfaatkan
--renormalize
bendera baru yang ditambahkan di git v2.16.0, dirilis Jan 2018. Untuk versi git yang lebih lama, ada beberapa langkah lagi:sumber
git reset
?git status
adalah menjalankangit diff --ignore-space-at-eol
hanya untuk memastikan bahwa satu-satunya perubahan yang Anda lakukan adalah akhiran baris.git reset
akan mendeteksi modifikasi, dan dengan demikian tidak berguna.--renormalize
bendera ditambahkan dalam v2.16.0 git yang dirilis pada bulan Januari 2018.--renormalize
Bendera mengkonsolidasikan proses akhir baris re-processing untuk setiap file dilacak ke satu perintah:git add --renormalize .
.Cara termudah untuk memperbaikinya adalah dengan membuat satu komit yang memperbaiki semua akhir baris. Dengan asumsi bahwa Anda tidak memiliki file yang dimodifikasi, maka Anda dapat melakukan ini sebagai berikut.
sumber
Prosedur saya untuk berurusan dengan akhir baris adalah sebagai berikut (pertempuran diuji pada banyak repo):
Saat membuat repo baru:
.gitattributes
komit pertama bersama dengan file khas lainnya seperti.gitignore
danREADME.md
Saat berurusan dengan repo yang ada:
.gitattributes
sesuaigit 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)alias fixCRLF="..."
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: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 checkoutoutdated-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'
) lalugit rebase master
. Setelah rebase, komit palsu harus pergi.sumber
2.7.0.windows.1
, saya menggunakan yang berikut:git rm --cached -r . && git reset --hard && git add . && git commit -m "Normalize EOL" -n
Penjelasan:
git status --short
Ini menampilkan setiap baris yang git sedang dan tidak sadari. File yang tidak di bawah kontrol git ditandai di awal baris dengan '?'. File yang dimodifikasi ditandai dengan M.
grep "^ *M"
Ini menyaring hanya file-file yang telah dimodifikasi.
awk '{print $2}'
Ini hanya menampilkan nama file tanpa spidol.
xargs fromdos
Ini mengambil nama file dari perintah sebelumnya dan menjalankannya melalui utilitas 'fromdos' untuk mengkonversi akhir baris.
sumber
dos2unix
alih-alihfromdos
.Inilah cara saya memperbaiki semua akhir baris di seluruh riwayat menggunakan
git filter-branch
. The^M
karakter harus dimasukkan dengan menggunakanCTRL-V
+CTRL-M
. Saya biasados2unix
mengonversi file karena ini secara otomatis melompati file biner.sumber
"| Xargs fromdos" membaca dari input standar (file
find
ditemukan) dan menggunakannya sebagai argumen untuk perintahfromdos
, yang mengubah akhir baris. (Apakah fromdos standar dalam lingkungan itu? Saya sudah terbiasa dengan dos2unix). Perhatikan bahwa Anda dapat menghindari penggunaan xargs (terutama berguna jika Anda memiliki cukup file sehingga daftar argumen terlalu panjang untuk xargs):atau
Saya tidak sepenuhnya yakin tentang pesan kesalahan Anda. Saya berhasil menguji metode ini. Program apa yang menghasilkan masing-masing? Untuk file / direktori apa Anda tidak memiliki izin? Namun, inilah saran untuk menebak apa yang Anda miliki:
Salah satu cara mudah untuk mendapatkan kesalahan 'file tidak ditemukan' untuk skrip adalah dengan menggunakan jalur relatif - gunakan yang absolut. Anda juga bisa mendapatkan kesalahan izin jika skrip Anda belum dapat dieksekusi (chmod + x).
Tambahkan komentar dan saya akan mencoba dan membantu Anda menyelesaikannya!
sumber
oke ... di bawah cygwin kita tidak memiliki fromdos yang mudah tersedia, dan subtitle awk itu meledak di wajah Anda jika Anda memiliki ruang di jalur untuk file yang dimodifikasi (yang kami punya), jadi saya harus melakukan itu agak berbeda:
kudos to @lloyd untuk sebagian besar solusi ini
sumber
Ikuti langkah-langkah ini jika tidak ada jawaban lain yang cocok untuk Anda:
git config --global core.autocrlf true
; jika Anda menggunakan Unix, lakukangit config core.autocrlf input
git rm --cached -r .
.gitattributes
git add -A
git reset --hard
Maka lokal Anda harus bersih sekarang.
sumber
.gitattributes
file adalah solusi untuk masalah akhir baris?