Git'te neden core.autocrlf = true kullanmalıyım?


296

Hem Windows hem de OS X'ten erişilen bir Git depom var ve zaten CRLF satır sonlarına sahip bazı dosyalar içerdiğini biliyorum. Anlayabildiğim kadarıyla, bununla başa çıkmanın iki yolu var:

  1. Set core.autocrlfiçin falseher yerde,

  2. Yönergeleri izleyin burada sadece LF line-sonları içerecek şekilde depoyu dönüştürmek için (Github yardım sayfalarında yankılandı) ve daha sonra ayarlamak core.autocrlfiçin trueWindows üzerinde ve inputbunu yaparken ile sorun OS X'te olduğu Depodaki herhangi ikili dosyaları varsa o:

    1. gitattributes'da doğru olarak ikili olarak işaretlenmezse ve
    2. hem CRLF'leri hem de LF'leri içerir,

    bozulacaklar. Depomun bu tür dosyalar içermesi mümkündür.

Öyleyse neden Git'in satır sonu dönüşümünü kapatmamalıyım? Web'de core.autocrlfsorunlara neden olanları kapatmayla ilgili çok fazla belirsiz uyarı var , ancak çok az spesifik uyarı var; Şimdiye kadar bulduğum tek şey, kdiff3'ün CRLF sonlarını (benim için sorun değil) işleyememesi ve bazı metin editörlerinin satır sonu sorunları (benim için de sorun değil) olmasıdır.

Depo şirketimin içindedir ve bu nedenle farklı autocrlf ayarları veya satır sonu gereksinimleri olan kişilerle paylaşma konusunda endişelenmem gerekmez.

Satır sonlarını olduğu gibi bırakmamda başka sorun var mı?


1
Misiniz stackoverflow.com/questions/2333424/... yardım? Fal'a bırakmak autocrlfiçin belirli nedenlerim var .
VonC

3
@VonC Teşekkürler, ancak şirketteki tüm kullanıcıların <code> autocrlf </code> 'u false olarak ayarladığını ve şu anda en iyi seçenek olduğuna inanıyorum. Ama bunu yapmamam için herhangi bir neden olup olmadığını bilmek istiyorum , çünkü ben autocrlf ayarlanması gerektiğini söyleyen bir sürü insan (örn. GitHub) bulabilirim, ancak nedenine dair gerçek bir özellik yok.
Zengin

3
@VonC ie autocrlffalse olarak ayarlamak için nedenler aramıyorum . Doğru yapmak için nedenler arıyorum.
Zengin

9
Neden kullanmıyorsunuz autocrlf = input: iki uç arasında mükemmel bir çözünürlük gibi görünüyor: deponuzu CRLF bokundan temiz tutuyorsunuz ve yerel olarak Windows geliştiricileri, yerel dosyaları kendilerine otomatik olarak sihirli bir şey yapmadan istediklerini kullanabilirler. (LF yerel olarak çeşitli nedenlerle isteyebilirsiniz, bu yüzden truekötü, bence.) Kullanmak için herhangi bir olumsuz göremiyorum autocrlf = input.
iconoclast

7
@iconclast, karşılaştığım bir neden, hem Windows toplu iş dosyalarını hem de Unix kabuk komut dosyalarını içeren dağıtımlar oluşturmanızdır. Her durumda biten doğru satırı kullanmak istersiniz ve Git onları bir şekilde veya başka bir şekilde ayarladıktan sonra bile etrafta dolanıyorsa bunu yapmak daha zordur.
user1809090

Yanıtlar:


228

Kümesine yalnızca belirli nedenler autocrlfiçin trueşunlardır:

  • Unix tabanlı bir EOL Git repo'yu Windows'a kopyalarken yapılan otomatik EOL dönüşümü nedeniyle git statustüm dosyalarınızı göstermekten kaçının modified( örneğin 83. sayfaya bakın)
  • ve kodlama araçlarınız bir şekilde dosyanızda bulunan yerel bir EOL stiline bağlıdır :

Belirli bir tedavi görebilirsiniz sürece gerekir yerli EOL başa, sen daha iyi durumda bırakarak autocrlfiçinfalse ( git config --global core.autocrlf false).

Bu yapılandırmanın yerel bir yapılandırma olacağını unutmayın (çünkü yapılandırma depodan depoya aktarılmaz)

O repo klonlama tüm kullanıcılar için aynı yapılandırma istiyorsanız "check out en iyisi nedir CRLFgit ile taşıma stratejisi? " Kullanılarak textöznitelik .gitattributesdosyası .

Misal:

*.vcproj    text eol=crlf
*.sh        text eol=lf

Not: git 2.8 (Mart 2016) 'dan başlayarak, birleştirme işaretleri artık bir CRLF dosyasında karışık satır sonu (LF) kullanmayacak.
Bkz: " <<<<<<< BAŞ‘birleştirme çizgileri onun üzerinde Git kullanımı CRLF yap’ "


5
@VonC Teşekkürler! Bu, kullanmamın güvenli olduğundan daha emin olmamı sağlıyor autocrlf=false. İlginin dışında, autocrlf yanlış olarak ayarlanmış olsa bile git neden hala eol dönüşümü yapıyor biliyor musunuz?
Zengin

14
@VonC: Bu cevabın doğru olduğunu düşünmüyorum. Windows'ta core.autocrlf = true kullanılması beklendiği gibi çalışır. Repodaki tüm dosyalar (bu senaryoda LF satır sonlarına sahip olmalıdır), ödeme sırasında Windows PC'ye CRLF satır sonlarına dönüştürülür. Tüm dosyalar bir Windows PC'den teslim alındığında LF satır sonlarına geri dönüştürülür. Başınızı belaya sokmanın yolu, başlangıçta yanlış core.autocrlf ayarına sahip bir Windows PC'ye çıkış yapmaktır (ki bu tamamen yapmak çok kolaydır).
Michael Maddox

3
@Michael Bu durumda core.autocrlf=falsesenaryomda kullanmamamın tek nedeni , satır sonları tarafından karıştırılacak bir araç / editörüm olsaydı?
Zengin

50
Kesinlikle kullanırdım false, arka planda gerçekleşen otomatik veya sihirli şeylerin büyük bir hayranı olmadım. Sadece kullanın \nve UTF-8her yerde ve iyi olacaksınız. Bazı fındık kafaları, kurallar ve kurallar olduğunu anlamayı ve kullanmayı unutmazsa UTF-8veya \nbirileri bunları manuel olarak dönüştürür ve yüzünü tokatlar.
Kule

5
@ Pauld'Aoust Yine de tüm dosyalar için gelişigüzel uygulanan bu genel ayarı kullanmak yerine, CRLF'ye ihtiyaç duyan dosya türünü core.eolbir .gitattributesdosyadaki özniteliklerle belirtmeyi tercih ederim . core.autocrlf
VonC

40

Ben bir .NET geliştiricisiyim ve Git ve Visual Studio'yu yıllardır kullanıyorum. Benim güçlü tavsiyem, satır sonlarını doğru olarak ayarlamaktır. Ve Deponuzun ömrü boyunca olabildiğince erken yapın.

Bununla birlikte, Git'in satır sonlarımı değiştirmesinden nefret ediyorum. Bir kaynak kontrolü sadece yaptığım işi kaydetmeli ve almalı, DEĞİŞTİRMEMELİDİR. Hiç. Ama öyle.

Her geliştiriciyi true değerine ayarlamazsanız ne olur, ONE geliştiricisi sonunda true değerine ayarlanır. Bu, deponuzdaki tüm dosyalarınızın satır sonlarını LF olarak değiştirmeye başlayacaktır. Kullanıcılar bunları kontrol etmek için yanlış ayarladığında, Visual Studio sizi uyarır ve değiştirmenizi ister. Çok hızlı bir şekilde 2 şey olacak. Birincisi, bu uyarıların gittikçe daha fazlasını alacaksınız, takımınız ne kadar büyük olursa o kadar fazla alırsınız. İkinci ve daha da kötüsü, değiştirilen her dosyanın her satırının değiştiğini gösterecektir (çünkü her satırın satır sonları gerçek adam tarafından değiştirilecektir). Sonunda repodaki değişiklikleri artık güvenilir bir şekilde izleyemeyeceksiniz. Herkesin doğru kalmasını sağlamak, herkesi yanlış tutmaya çalışmaktan çok daha kolay ve temizdir. Güvenilir kaynak kontrolünüzün yapmaması gereken bir şey yapıyor olması gerçeği ile yaşamak kadar korkunç. Hiç.


Şirketim, yanlış olanın her yerde kullanılmasını kolayca zorunlu kılabilecek kadar küçüktür ve daha büyük şirketlerin bunu politika yoluyla yapabileceğini düşünürdüm, ama sanırım bu "doğru" kullanmak için meşru bir neden, bu yüzden yukarı çıkıyorum neyse. Teşekkürler!
Zengin

1
Bunu bir ilke (zorla uygulanan) ile yapmanın sorunu, bir Windows makinesinde yerel, genel ve gizli bir yapılandırma dosyasına (ProgramData / Git / Confg) sahip olabilmenizdir. Yerel olanı repoda denetleyerek uygulayabilirsiniz, ancak Global VE gizli dosyalar önceliklidir. Ayrıca yerel ve küresel (veya gizli) farklı olmak da mümkündür. Eğer öyleyse, SAME makinesinde birbirleriyle çakışacaklar ve hiçbiri olmadığında satır sonu hatalarına neden olacaklar. Bu izini sürmek için bir acı. :(
JGTaylor

7
tam olarak ne düşündüğümü. onun bir kaynak kontrol işi değil gibi kod dosyaları ile karmakarışık. satır sonları, düzenleme araçlarıyla ilgili bir endişe olmalı, başka bir şey değil.
Tuncay Göncüoğlu

6
Projeniz yalnızca Windows ise sorun yoktur. Ancak siz veya iş arkadaşlarınız * nix platformunda çalışıyorsanız "güçlü tavsiyeniz" sorunlara neden olur. Shebang ile biten bir bash, perl veya python betiği çalıştırmayı deneyin \r\nve göreceksiniz.
phuclv

6
GIT sorunu olarak tanımladığınız durum, ayarı genellikle olması gerektiği gibi FALSE olarak ayarlayın ve gitti. Instad, ekip çalışmasında bir problem. "Sonunda bir geliştirici seti true" ne anlama geliyor ? Neden ilk etapta onlara izin veriyorsun? git repo'ya erişmeye ayarladığınızda, tıpkı belirli alanları farklı şeritlerle kirletmenize izin vermediğiniz gibi (böylece üzerinde çalışan herkes okuyabilir) veya tıpkı seçilen dallarda / birleşme / rebases / vb. politika, açık bir kural almalıdır: doğru crlf ayarlayın.
quetzalcoatl

12

Güncelleme 2 :

Xcode 9, dosyanın geçerli satır sonlarını yoksayacak bir "özelliğe" sahip gibi görünüyor ve bunun yerine, bir dosyaya satır eklerken varsayılan satır sonu ayarınızı kullanarak karışık satır sonlarına sahip dosyalara neden oluyor.

Eminim bu hata Xcode 7'de yoktu; Xcode 8'den emin değilim. İyi haber şu ki, Xcode 10'da düzeltilmiş gibi görünüyor.

Varolduğu süre boyunca, bu hata, soruda bahsettiğim kod tabanında (bu güne kadar kullanılan autocrlf=false) küçük bir miktar komikliğe neden oldu ve birçok "EOL" taahhüt mesajına ve nihayetinde pre-commitkontrol etmek için bir git kancasını yazmaya neden oldu karışık satır sonlarının girilmesi / önlenmesi için.

Güncelleme :

Not: As Git 2.8 başlayarak VonC tarafından da belirtildiği, birleştirme belirteçleri olacak değil , bir Windows tarzı dosyasına Unix tarzı satır sonları tanıtmak .

Orijinal :

Bu kurulumla fark ettiğim küçük bir hıçkırık, birleştirme çakışmaları olduğunda, git farklarını işaretlemek için eklenen satırların , dosyanın geri kalanı olsa bile Windows satır sonlarına sahip olmaması ve sonlandırmanızdır. karışık satır sonlarına sahip bir dosya ile, örneğin:

// Some code<CR><LF>
<<<<<<< Updated upstream<LF>
// Change A<CR><LF>
=======<LF>
// Change B<CR><LF>
>>>>>>> Stashed changes<LF>
// More code<CR><LF>

Bu bize herhangi bir soruna neden olmaz (her iki satır sonunu da ele alabilecek herhangi bir aracın karışık satır sonlarıyla da mantıklı olacağını düşünürüm - kesinlikle kullandığımız her şey yapar), ancak farkında olunması gereken bir şey.

Bulduğumuz diğer bir şey *git diff , Windows satır sonlarına sahip bir dosyadaki değişiklikleri görüntülemek için kullanıldığında , eklenen satırların satır başlarını görüntülemesidir, böylece:

    // Not changed

+   // New line added in^M
+^M
    // Not changed
    // Not changed

* "Sorun" terimini hak etmiyor.


2
Not Visual Studio böyle bir dosyayla karşılaştığında, satır sonlarını sizin için normalleştirmeyi önerir. Ya, Windows hat-sonları Picking veya seçilmesi değil hat-sonları normalleştirmek için (VS yine ekranlara olarak doğru rencide hatları çatışma çözüldükten sonra silinmiş olacaktır) cezası çalışır.
Zengin

2
Maalesef kurumsal sürüm kontrolü naziler buna katılmıyor (birleşme çatışması belirteçlerinde LF) bir sorun değil.
Ilia G

1
Birleştirme çatışması belirteçlerindeki LF'nin bir sorun olmaması gerektiğine katılıyorum. Bu hatlar yine de repoya bağlı olmamalı.
soymak

1
Not: git 2.8 (Mart 2016) 'dan başlayarak, birleştirme işaretleyicilerinin aslında CRLF satırı biter. Bkz. Stackoverflow.com/a/35474954/6309
VonC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.