Git'i pencereler altında CR + LF yerine LF kullanmaya nasıl zorlarım?


335

Sadece kullanarak Windows altında ödeme dosyalarına budala zorlamak istiyorum LFdeğil CR+LF. İki yapılandırma seçeneğini kontrol ettim ancak doğru ayar kombinasyonunu bulamadım.

Ben tüm dosyaları dönüştürmek LFve dosyaları tutmak istiyorum LF.

Not: Kullandım autocrlf = inputama bu sadece onları taahhüt ettiğinizde onarır. Onları kullanmaya zorlamak istiyorum LF.

Muhtemelen o kadar net değildim: depo zaten kullanıyor LFama msysgit kullanarak kullanıma alınmış dosyaları kullanıyor CR+LFve msysgit ile onları almak için zorlamak istiyorum LF: zorla Unix satır sonları .

>git config --list | grep crlf
core.autocrlf=input

2
autocrlf=inputdoğru seçenektir. Tabii ki sizi git'e eklemeden önce cr+lfdepoda gerçekten bulunan veya cr+lfbaşka bir araçla dosya oluşturan dosyalardan korumaz . Bunun işe yaramadığı sorunlar neler?
CB Bailey

2
Depodaki dosyalar zaten sadece kullanıyor LFancak Windows altında aldığımda msysgit bunları dönüştürüyor CR+LF.
sorin

Yapılandırmanızda bir şey olmalı; Bunu sadece msysgit kurulumumda test ettim. Olarak autocrlfayarlandığında inputgit lfsatır beslemelerini yalnız bırakır . Çıktısını gönderebilir misiniz git config?
CB Bailey

1
Bu durumda, bir hata kaydetmenizi öneririm; tercihen sorununuzu gösteren bir test havuzuna işaret etmek ve gördüğünüz davranış olarak yeniden oluşturma adımları dahil etmek kesinlikle yanlıştır (ancak yeniden üretemiyorum).
CB Bailey

1
Küçük bir ipucu da olduğunu düşündüğünüz 'git' üzerinde git komutlarını çalıştırdığınızdan emin olmaktır. Örneğin git'i windows'a, git'i cygwin'e kurmuş olabilirsiniz, bu yüzden doğru git config'i ayarladığınızdan emin olun.
lfred

Yanıtlar:


106

OP sorusuna şunları ekledi:

msysgit kullanarak teslim alınmış dosyalar CR+LFve msysgit ile onları almak için zorlamak istiyorumLF

İlk basit adım yine de bir .gitattributesdosyada olacaktır:

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

( torun tarafından yapılan açıklamalarda belirtildiği gibi, Satır sonu dönüşümüne atıfta bulunarak ), doğru olan dosyalar için herhangi bir dönüşümden kaçınmak için ..gitattributesCRLFeol

Ve her zaman git config --global core.autocrlf false ( tüm sürümlü dosyalar için geçerli olacak) herhangi bir dönüşümü devre dışı bırakmayı önerdim

Bkz . Çapraz platform git config için en iyi uygulamalar?

Git 2.16'dan (1. Çeyrek 2018) beri , git add --renormalize .bu .gitattributesayarları hemen uygulamak için kullanabilirsiniz .


Ancak ikinci daha güçlü bir adım, bir gitattribute filtre sürücüsü içerir ve bir leke adımı ekler

filtre sürücüsü

Çalışma ağacınızı her güncelleyişinizde, bir komut dosyası, yalnızca belirttiğiniz dosyalar için .gitattributes, zorlamak istediğiniz LF eolve diğer biçimlendirme seçeneklerinde zorlanabilir.
" clear" Komut dosyası hiçbir şey yapmazsa, dosyalarınızı (tamamlandıktan sonra) tam olarak izlemeniz gereken formatı uygulayarak dönüştürdünüz.


Bir soru: * .txt, .txt uzantılı tüm dosyaları veya tüm metin dosyalarını (ikili olmayan) ifade eder? Projede sahip olacağım her türlü dosya uzantısına sahip bir liste yapamıyorum.
sorin

1
@Sorin: .txtuzantılı tüm dosyalar . * 'A genelleme yapmadan önce bunu oluşturmak ve belirli bir grupta test etmek ve !*.xyz ...birkaç kuralı bu kuralın dışında bırakmak için negatif bir kural eklemek tercih edilir.
Mart'ta VonC

1
Artık .gitattributeshatları şöyle olmalıdır: *.txt text eol=lfuyarınca git-scm.com/docs/gitattributes
torun

@grandchild Teşekkür ederim. Daha fazla görünürlük için yorumunuzu cevaba ekledim.
VonC

Sanırım ekledikten sonra .gitattributesyapmalıyızgit add --renormalize .
shuva

461

Windows LF sonlar almak için uygun yolu ilk sete olduğu core.autocrlfiçin false:

git config --global core.autocrlf false

Msysgit kullanıyorsanız bunu yapmanız gerekir, çünkü truesistem ayarlarında bunu yapar .

Şimdi git normalleşmeye son veren bir satır yapmayacak. Giriş yaptığınız dosyaların normalleştirilmesini istiyorsanız text=auto, şunu yapın .gitattributes: Tüm dosyalar için ayarlarınızı yapın:

* text=auto

Ve set core.eoliçin lf:

git config --global core.eol lf

Artık tek depoları çalıştırarak crlf (çalışma dizininde!)

git config core.eol crlf

Eğer yapılandırma yaptıktan sonra, tüm dosyaları normalleştirmek için git isteyebilirsiniz repo . Bunu yapmak için deponuzun kök dizinine gidin ve şu komutları çalıştırın:

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f

Git'in çalışma dizininizdeki dosyaları da normalleştirmesini istiyorsanız , şu komutları çalıştırın:

git ls-files -z | xargs -0 rm
git checkout .

3
Ben ölümcül pathspec alıyorum '' herhangi bir dosya ile eşleşmedi, hemen sonragit diff --cached --name-only -z | xargs -0 git add
CMCDragonkai

3
çıktı git diff --cached --name-onlynedir?
Mart'ta Chronial

1
Bu değer, bu yapılandırma ayarlayabilirsiniz söz olabilir iken mesela, söz konusu repo klonlama git clone --config core.autocrlf=false <repo path>.
Chris Long

240

Bu cevaba oldukça sık geri dönüyorum, ancak bunların hiçbiri benim için doğru değil. Bununla birlikte, benim için doğru cevap diğerlerinin bir karışımı.

Yaptığım şey şudur:

 git config --global core.eol lf
 git config --global core.autocrlf input

Bu genel ayarlar yapıldıktan sonra teslim alınan depolar için, her şey repoda olduğu gibi kontrol edilecektir - umarım LF( \n). Herhangi CRLFbiri sadece LFcheck-in sırasında dönüştürülecektir .

Daha önce kontrol ettiğiniz mevcut bir repo ile - repoda doğru satır sonlarına sahip olan, ancak çalışma kopyanız değil - düzeltmek için aşağıdaki komutları çalıştırabilirsiniz:

git rm -rf --cached .
git reset --hard HEAD

Böylece, komut istemi rm( r) olmadan ( ) özyinelemeli ( ) -f, düzenlediğiniz ( --cached) dışındaki tüm dosyalar geçerli dizinden ( ) silinir .. resetO zaman onların gerçek satır sonları (repo içinde ne eşleştirme) sahip bir devlete bu dosyaların hepsi döner.

Bir repodaki dosyaların satır sonlarını düzeltmeniz gerekiyorsa, bunu IntelliJ veya Sublime Text gibi toplu olarak yapmanıza izin verecek bir düzenleyici almanızı öneririz, ancak eminim ki iyi bir olasılıkla bunu destekleyecektir.


1
Farklı satır sonu işlemleri gerektiren alt dizinlere sahip tek bir repo var. Bu nedenle, global bir seçenek belirlemek bunun için çalışmaz. Tek bir depoda bile. Aynı ayarları .gitattributes'a nasıl uygularsınız?
RobG

Notepad++ayrıca para birimi açılmış dosyanın sağ alt köşesindeki satır sonunu gösterir. Bu alana sağ tıklanması satır sonlarını değiştirmenize izin verecektir.
winklerrr

1
core.autocrlf inputSeçenek geçersiz kılar core.eol, böylece hem gereksiz ayarlama ayarı. (Bkz. Git-scm.com/docs/git-config )
Andrew Marshall

1
Teşekkürler, sizin yardımınızla lint ve Linux'u fethettim. Ve şimdi dosyaları iade edebilirsiniz.
GC_

57

bağlam

Eğer sen

  1. tüm kullanıcıları metin dosyaları için LF satır sonlarına sahip olmaya zorlamak ve
  2. tüm kullanıcıların git yapılandırmalarını değiştirmelerini sağlayamazsınız,

bunu git 2.10 ile başlayarak yapabilirsiniz. 2.10 veya üstü gereklidir, çünkü 2.10, eol = lf ile birlikte text = auto davranışını düzeltmiştir . Kaynak .

Çözüm

.gitattributesGit deponuzun kök dizinine aşağıdaki içeriğe sahip bir dosya koyun :

* text=auto eol=lf

Tamamlayın.

İsteğe bağlı ince ayarlar

Ayrıca .editorconfigmodern araçların istenen satır sonlarıyla yeni dosyalar oluşturmasını sağlamak için deponuzun köküne bir de ekleyebilirsiniz .

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

3
Bu benim için en iyi çözümdü. Bunu ayrıca editorconfig.org ile birleştirdim, böylece Intellij'de yazarken LF EOL'leri yazarım.
Jazzepi

Bu açık ara en iyi çözümdür. Herhangi bir yapılandırma komutunu manuel olarak çalıştırmanıza gerek yok!
Cameron Tacklind

26

core.autocrlf=inputistediğiniz ayar için doğru ayardır, ancak değişikliğin geçerli olması için a git update-index --refreshve / veya a yapmanız gerekebilir git reset --hard.

İle core.autocrlfayarlandığında inputgit, check-out sırasında yeni satır dönüşümünü uygulamaz (bu nedenle repoda LF varsa, LF alırsınız), ancak çalışma sırasında bazı CRLF'leri karıştırmanız ve tanıtmanız durumunda emin olursunuz. bir şekilde kopyalar, repoya girmezler.


19
Komutlar git rm --cached -r olmalıdır. && git reset --hard
koppor

0

Bu sorunun çözümünü şu adreste bulabilirsiniz: https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings

Bu sorunu Windows'ta nasıl çözebileceğinizle ilgili basitleştirilmiş açıklama:

Satır sonları için genel ayarlar git config core.autocrlf komutu Git'in satır sonlarını işleme şeklini değiştirmek için kullanılır. Tek bir argüman alıyor.

Windows'da, yapılandırmaya sadık kalırsınız. Örneğin: C:> git config --global core.autocrlf true

İyi şanslar, umarım yardımcı oldum.

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.