Kemungkinan Penyebab # 1 - Normalisasi Akhir Baris
Satu situasi di mana ini bisa terjadi adalah ketika file tersebut diperiksa ke dalam repositori tanpa konfigurasi yang benar untuk akhir baris (1) menghasilkan file dalam repositori dengan salah satu akhir baris yang salah, atau akhir baris campuran. Untuk mengonfirmasi, verifikasi yang git diff
hanya menunjukkan perubahan di akhir baris (ini mungkin tidak terlihat secara default, coba git diff | cat -v
lihat carriage return sebagai ^M
karakter literal ).
Selanjutnya, seseorang mungkin menambahkan .gitattributes
atau mengubah core.autocrlf
pengaturan untuk menormalkan akhir baris (2). Berdasarkan pada .gitattributes
atau konfigurasi global, Git telah menerapkan perubahan lokal pada copy pekerjaan Anda yang menerapkan normalisasi akhir baris yang diminta. Sayangnya, untuk beberapa alasan git reset --hard
tidak membatalkan perubahan normalisasi garis ini.
Larutan
Penanganan masalah di mana ujung jalur lokal diatur ulang tidak akan menyelesaikan masalah. Setiap kali file "dilihat" oleh git, ia akan mencoba dan menerapkan kembali normalisasi, menghasilkan masalah yang sama.
Pilihan terbaik adalah membiarkan git menerapkan normalisasi yang diinginkannya dengan menormalisasi semua akhir baris dalam repo agar sesuai dengan .gitattributes
, dan melakukan perubahan itu - lihat Mencoba memperbaiki akhir baris dengan git-cabang-filter, tetapi tidak berhasil .
Jika Anda benar-benar ingin mencoba dan mengembalikan perubahan ke file secara manual maka solusi termudah tampaknya menghapus file yang dimodifikasi, dan kemudian memberitahu git untuk mengembalikannya, walaupun saya perhatikan solusi ini tampaknya tidak bekerja secara konsisten 100% dari waktu ( PERINGATAN: JANGAN jalankan ini jika file Anda yang dimodifikasi memiliki perubahan selain dari akhir baris !!):
git status --porcelain | grep "^ M" | cut -c4- | xargs rm
git checkout -- .
Perhatikan bahwa, kecuali jika Anda menormalkan akhir baris di repositori di beberapa titik, Anda akan terus mengalami masalah ini.
Kemungkinan Penyebab # 2 - Ketidaksensitifan Kasus
Penyebab kedua yang mungkin adalah ketidakpekaan huruf pada Windows atau Mac OS / X. Misalnya, katakan path seperti yang berikut ini ada di repositori:
/foo/bar
Sekarang seseorang di Linux melakukan file ke /foo/Bar
(mungkin karena alat membangun atau sesuatu yang membuat direktori itu) dan mendorong. Di Linux, ini sebenarnya sekarang adalah dua direktori yang terpisah:
/foo/bar/fileA
/foo/Bar/fileA
Memeriksa repo ini pada Windows atau Mac dapat mengakibatkan modifikasi fileA
yang tidak dapat direset, karena pada setiap reset, git pada Windows memeriksa /foo/bar/fileA
, dan kemudian karena Windows tidak peka huruf besar-kecil, menimpa konten fileA
dengan/foo/Bar/fileA
, yang mengakibatkan mereka "dimodifikasi".
Kasus lain mungkin merupakan file individual yang ada dalam repo, yang ketika diperiksa pada sistem file case tidak sensitif, akan tumpang tindih. Sebagai contoh:
/foo/bar/fileA
/foo/bar/filea
Mungkin ada situasi serupa lainnya yang dapat menyebabkan masalah seperti itu.
git pada kasus filesystem tidak sensitif harus benar-benar mendeteksi situasi ini dan menunjukkan pesan peringatan yang bermanfaat, tetapi saat ini tidak (ini dapat berubah di masa depan - lihat diskusi ini dan usulan tambalan terkait pada milis git.git).
Larutan
Solusinya adalah untuk membawa kasus file dalam indeks git dan kasus pada sistem file Windows menjadi sejajar. Ini bisa dilakukan di Linux yang akan menunjukkan keadaan sebenarnya, ATAU di Windows dengan utilitas open source yang sangat berguna Git-Unite . Git-Unite akan menerapkan perubahan kasus yang diperlukan untuk indeks git, yang kemudian dapat dilakukan untuk repo.
(1) Ini kemungkinan besar dilakukan oleh seseorang yang menggunakan Windows, tanpa .gitattributes
definisi untuk file yang dimaksud, dan menggunakan pengaturan global default untuk core.autocrlf
yang mana adalah false
(lihat (2)).
(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/
.
singkatan direktori saat ini bukan direktori root