Olası Neden # 1 - Satır Sonu Normalizasyonu
Bunun olabileceği durumlardan biri, söz konusu dosyanın, satır sonları (1) için doğru yapılandırma olmadan havuzda kontrol edilmesi, havuzda yanlış satır sonları veya karışık satır sonları olan bir dosyaya neden olmasıdır. Onaylamak için, git diff
yalnızca satır sonlarındaki değişiklikleri gösterdiğini doğrulayın (bunlar varsayılan olarak görünmeyebilir, git diff | cat -v
satır başlarını değişmez ^M
karakterler olarak görmeye çalışın ).
Daha sonra, birisi muhtemelen satır sonlarını normalleştirmek .gitattributes
için bir core.autocrlf
ayar ekledi veya değiştirdi (2). Dayanarak .gitattributes
veya global geneli, Git istenen normalleşmesini biten çizgi uygulamak için çalışma kopyasına yerel değişiklikleri uygulamıştır. Ne yazık ki, bazı nedenlerden dolayı git reset --hard
bu çizgi normalizasyon değişikliklerini geri almaz.
Çözüm
Yerel satır sonlarının sıfırlandığı geçici çözümler sorunu çözmez. Dosya git tarafından her "görüldüğünde" normalleşmeyi tekrar dener ve aynı soruna neden olur.
En iyi seçenek, git'in repodaki tüm satır sonlarını eşleştirmek için normalleştirerek .gitattributes
ve bu değişiklikleri yaparak normalleştirmeyi uygulamasına izin vermektir - bkz. Satır uçlarını git filtre dalı ile düzeltmeye çalışmak, ancak şansı yok .
Eğer gerçekten değişiklikleri el ile geri döndürmek istiyorsanız, o zaman en kolay çözüm değiştirilmiş dosyaları silmek ve daha sonra bu çözümü tutarlı bir şekilde çalışmıyor gibi göründüğüne dikkat etmeliyim. saat ( UYARI: Değiştirilen dosyalarınızda satır sonları dışında değişiklikler varsa bunu ÇALIŞTIRMAYIN !!):
git status --porcelain | grep "^ M" | cut -c4- | xargs rm
git checkout -- .
Depodaki satır sonlarını bir noktada normalleştirmezseniz, bu sorunla karşılaşmaya devam edeceğinizi unutmayın.
Olası Neden # 2 - Büyük / Küçük Harfe Duyarsızlık
İkinci olası neden, Windows veya Mac OS / X'te büyük / küçük harfe duyarsızlıktır. Örneğin, depoda aşağıdakine benzer bir yol olduğunu varsayalım:
/foo/bar
Şimdi Linux'taki birisi dosyaları /foo/Bar
(muhtemelen bir oluşturma aracı veya bu dizini oluşturan bir şey nedeniyle) taahhüt eder ve iter. Linux'ta, bu aslında iki ayrı dizin:
/foo/bar/fileA
/foo/Bar/fileA
Modifiye neden olabilir Windows ya da Mac üzerinde bu repo denetleniyor fileA
dışarı, Windows çeklerde çünkü her reset üzerine, sıfırlama olamayacağı, Git /foo/bar/fileA
, Windows duyarsız olduğu ve daha sonra çünkü içeriğini üzerine yazar fileA
ile /foo/Bar/fileA
"modifiye" olma onlara sonuçlanan.
Başka bir vaka, büyük / küçük harfe duyarlı olmayan bir dosya sisteminde teslim alındığında çakışmaya neden olacak repoda bulunan tek bir dosya olabilir. Örneğin:
/foo/bar/fileA
/foo/bar/filea
Bu tür sorunlara neden olabilecek başka benzer durumlar da olabilir.
büyük / küçük harf duyarlı olmayan dosya sistemleri bu durumu gerçekten algılamalı ve yararlı bir uyarı mesajı göstermelidir, ancak şu anda değişmemektedir (bu gelecekte değişebilir - git.git posta listesinde bu tartışmaya ve ilgili önerilen yamalara bakın ).
Çözüm
Çözüm, git dizinindeki dosyaların ve Windows dosya sistemindeki durumun hizalanmasıdır. Bu, işlerin gerçek durumunu gösterecek Linux'ta VEYA çok faydalı açık kaynak programı Git-Unite ile Windows'ta yapılabilir . Git-Unite, git dizinine gerekli vaka değişikliklerini uygular ve bu da daha sonra repoya yüklenebilir.
(1) Bu hiçbiri olmadan Windows'u kullanan bir kişi tarafından büyük olasılıkla oldu .gitattributes
, söz konusu dosya için tanım ve varsayılan genel ayarı kullanan core.autocrlf
hangi false
(bkz (2)).
(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/
.
geçerli dizini değil kök dizini anlamına gelir