Git EOL Dönüşümlerini devre dışı bırak


107

Git'in herhangi bir işlem için herhangi bir satır sonunu değiştirmemesini sağlamaya çalışıyorum. Ne yazık ki, ne olursa olsun öyle görünüyor. Bunu, bulabildiğim kadarıyla bu davranışı devre dışı bırakmak için birçok farklı mekanizmaya sahip olan aşağıdaki test senaryosuna indirdim.


  • İki makineyle başlayın (Windows bilgisayar = A, Linux bilgisayar = B)
  • Her iki makinede: git config --global core.autocrlf false
  • Her iki makinede: git config --global core.eol crlf( her ihtimale karşı)

  • A üzerinde yeni depo oluşturun. Boş bir klasörden:
    • git init --shared(daha sonra oluşturulan .gitdizini gösterin )
    • .gitignoreDepoda yeni bir dosya oluşturun
    • .gitattributesArşivde tek satırla yeni bir dosya oluşturun :* -text
    • git add ., sonra git commit -m "initial commit"etrafta çalışmak için, örneğin bu .
    • git branch master_recv
    • Uzaktan kumanda ekle
  • document.txtCRLF içeren depoda yeni bir dosya oluşturun
  • Kaydet:, git add -Asonragit commit -m "<something>"
  • document.txtA'ların hala CRLF içerdiğini unutmayın (ve onu silip sıfırlamak --hardhala CRLF'li sürümü döndürür)

  • B bilgisayarına tüm dizini SCP
  • new fileCRLF içeren yeni bir dosya ekleyin
  • Kaydet:, git add -Asonragit commit -m "<something>"
  • B'nin document.txtve B'nin new fileher ikisinin de hala CRLF içerdiğini unutmayın.

  • B'nin ustasını A'ya çekin: git pull <remote> master:master_recv
  • A'lar document.txtLF'ye değişti. Eklenen dosya new fileayrıca LF içerir.

B bir Windows makinesiyse sorun oluşmaz.


Has core.autocrlf hep yanlış olmuştur? \nDeponuzda zaten satır sonları var gibi görünüyor ? Orada hiçbir değiştirmek için ayar \niçin depoda \r\nçalışma dizininde.
Edward Thomson

Her zaman ayarlanmamıştır (örneğin, repo orijinal olarak oluşturulduğunda). Ancak, repoda halihazırda herhangi bir CR hattı sonu olmamalıdır. Ayrıca, yine, herhangi bir değişiklik olmasını istemiyorum .
imallett

Kurulum Soruyorum çünkü gerektiğini CRLF olarak satır sonu korumak. Sadece benim (kuşkusuz can sıkıcı) düzenlemem için, arşivinize nesne kimliğiyle birlikte bir dosya gönderebilir misiniz ?
Edward Thomson

@EdwardThomson ne demek istiyorsun? Depo halka açık değildir (Linux makinesi olmadığı için). Örnek bir dosya istediğinizi varsayacağım. Düzenlemeye bakın.
imallett

Evet, o dosyanın CRLF satır sonlarına sahip olduğunu kabul ediyorum. Bir şeyi açıklığa kavuşturabilir misiniz: "Windows makinesinin satırsonlarının CR olarak değiştiğinden" bahsettiniz! Elbette bu bir yazım hatasıydı, yoksa gerçekten Mac OS 9 tarzı satır başı satırı sonları mı alıyorsunuz?
Edward Thomson

Yanıtlar:


78

Projenizin içinde bir .gitattributesdosya olmalı . Çoğu zaman aşağıdaki gibi görünmelidir (veya bu ekran görüntüsü ):

# Handle line endings automatically for files detected as text 
# and leave all files detected as binary untouched.
* text=auto

# Never modify line endings of our bash scripts
*.sh -crlf

#
# The above will handle all files NOT found below
#
# These files are text and should be normalized (Convert crlf => lf)
*.css           text
*.html          text
*.java          text
*.js            text
*.json          text
*.properties    text
*.txt           text
*.xml           text

# These files are binary and should be left untouched
# (binary is macro for -text -diff)
*.class         binary
*.jar           binary
*.gif           binary
*.jpg           binary
*.png           binary

Değişim * text=autoiçin * text=falsedevre dışı otomatik kullanım için (bkz ekran-shot ).

Bunun gibi:

görüntü açıklamasını buraya girin

Projenizde .gitattributes dosyası yoksa, satır sonları git yapılandırmalarınız tarafından belirlenir. Git yapılandırmalarınızı değiştirmek için şunu yapın:

Bu dizindeki yapılandırma dosyasına gidin:

1) C: \ ProgramData \ Git \ config

2) Yapılandırma dosyasını Notepad ++ 'da (veya tercih ettiğiniz metin düzenleyicide) açın

3) "autocrlf =" değerini yanlış olarak değiştirin.

görüntü açıklamasını buraya girin


31
Neden kod etiketleri yerine resimler kullanılıyor? Çok rahatsız edici
Clint

34
Çünkü bir şeyleri vurgulamak için resme büyük kırmızı bir kutu ekleyebilirim.
Gene

23
Kullanılması * text=falsedeğil tanımsız metni yapar: o dize değeri False metin kümesi bırakır. Bu, metni belirtilmemiş olarak bırakmakla aynı etkiye sahiptir (özellikle ayarlanmadan değil). Kullanmak * -text, ona özel ayarlanmamış ayarı verir. Bir yoldaki metin özniteliğinin ayarının kaldırılması, git'e iade veya ödeme sırasında herhangi bir satır sonu dönüşümü denememesini söyler.
JustAMartin

Bu cevap için @ Gene teşekkür ederim. Bu beni bütün gün çıldırtıyordu ve bu benim için çözdü!
LeopardSkinPillBoxHat

8
Bu cevap için teşekkür edemeyeceğimi söylediğim için üzgünüm. Birinin yanıltıcı tavsiyelere uyduğunu öğrenmek bana yarım güne mal oldu. @JustAMartin'in belirttiği gibi * text=falseetkisi yok. Lütfen cevabı düzeltin!
Paul B.

54

Basit bir çözüm şudur:

  • core.autocrlf'nin tüm depolar için false olarak ayarlandığından emin olun :
    git config --global core.autocrlf false
  • repo'nuzu yeniden klonlayın ve EOL dönüşümünün yapılmadığını kontrol edin.
  • veya Git 2.16'dan (Q1 2018) itibaren , mevcut deponuzu koruyun vegit add --renormalize .

Otomatik olarak yapılan dönüşümler varsa, bu , repo içinde bir .gitattributes core.eoltalimat olduğu anlamına gelir .

İle Git 2.8+ (2016 Mart) hala ile eol dönüşüm varsa, kontrol edin:

git ls-files --eol

3
SADECE autocrlfBUGÜN KULLANMAYIN ! unsetted autocrlfeşdeğerdir false. Git
Lazy Badger'da

1
Yukarıdaki gibi, bunu denedim (küresel bayrakla olmasa da) ve işe yaramadı. git sürümü 1.8.5.2.
imallett

@IanMallett "Bu noktada, Linux makinesinin hala CRLF'ye sahip olduğu görülüyor": içeriğini yeniden normalleştirene veya klonlayana kadar (Windows'ta yaptığınız gibi)
VonC

Bunu yalnızca bir depo için yapmaya çalışıyorsanız, o zaman basitçe çalıştırın git config core.autocrlf false- bundan bahsedin çünkü genellikle autocrlf truepencereler ve inputdiğerleri için olmalıdır , ancak bazen garip uç durumlar için özel bir şeye ihtiyacınız vardır. Benim durumumda, bazı dosyaları indirdim ve ne yaptığımı hatırlayabilmek için yaptığım değişiklikleri kaydetmek istiyorum (koddaki değişiklikleri takip etmenin aksine). Satır sonlarının önemli olup olmadığını bilmiyorum (ve farkların "gerçek" şeylere karşı anlamlı olmasını istiyorum) bu yüzden otocrlf'i devre dışı bıraktım.
Kaptan Adam

11

Bunu anladım. Görünüşe göre SCP programı satır sonlarını dönüştürüyordu. Bunu, kasıtlı olarak LF sonlu bir dosya oluşturmaya çalıştığımda ve ardından indirildiğinde CRLF olarak göründüğünü gözlemlediğimde fark ettim.

Bu benim için çözüm olduğu için bu cevabı kabul ediyorum, ancak geleceğin insanları daha genel bir çözüm için diğer cevaplara da başvurmalı.


1
İyi yakaladım, cevabımdan daha belirgin. +1
VonC

4

Gönderen gitattributes (5) Manuel Sayfa "Efektler" konu

text

Bu özellik, hat sonu normalizasyonunu etkinleştirir ve kontrol eder. Bir metin dosyası normalleştirildiğinde, satır sonları bilgi havuzunda LF'ye dönüştürülür. Çalışma dizininde hangi satır sonlandırma stilinin kullanıldığını kontrol etmek eoliçin, tek bir dosya için niteliği ve core.eol tüm metin dosyaları için yapılandırma değişkenini kullanın.

Set

Bir yol üzerinde metin niteliğinin ayarlanması, satır sonu normalizasyonunu etkinleştirir ve yolu bir metin dosyası olarak işaretler. Satır sonu dönüştürme, içerik türünü tahmin etmeden gerçekleşir.

Unset Bir yoldaki metin özniteliğinin ayarını kaldırmak, Git'e iade veya ödeme sırasında herhangi bir satır sonu dönüştürme girişiminde bulunmamasını söyler.

core.autocrlfyeni (1.7.2+) 'de Git kullanılmıyor core.eolve doğru ayar | metin özniteliğinin ayarının kaldırılması daha güvenilir bir yol olarak kabul edildi


Gelen .gitattributesdosya Gerçi sağ metin olarak açıkça özürlü her şey vardı? Ayrıca, onu dönüştürme yapmamasını sağlayacak bir seçenekle görmüyorum (ancak crlfhiçbir etkisi olmayabilir)?
imallett

7
Genellikle karışır Önemli şey - ayarları kaldırılamaz textve herhangi bir dönüştürme işlemi yapmamak için hiç .gitattributes belirlesin * -text ve değil * text=false. öznitelik falseiçin geçerli bir değer değil text- git onu tanımaz ve bunun yerine varsayılan autocrlf ayarına geri döner. Ayrıca, textdeğeri değiştirdikten sonra yerel deponuzdaki tüm dosyaları yedeklemeniz, bir işlem yapmanız, ardından dosyaları ihtiyaç duyduğunuzda doğru satır sonlarıyla geri yüklemeniz ve geri yüklemeniz gerekir. O zaman satır sonlarınız bir daha git tarafından değiştirilmeyecek.
JustAMartin

0

İşte bunu tek bir depo için nasıl yapacağınız.

Dosyayı .gitattributesdeponun kök dizininde bu satırla oluşturun

* -text

Bu kadar. Bu, tüm dosyalarla eşleşen bir joker karakterdir ve git'e metin özelliğini kaldırmasını söyler. Bu, git'in tüm dosyaları ikili olarak kabul ettiği ve dolayısıyla herhangi bir satır sonlandırma dönüşümü gerçekleştirmediği anlamına gelir.

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.