Windows git “uyarı: LF, CRLF ile değiştirilecek”, bu uyarı kuyruğu geriye mi?


147

env:

  • Windows 7
  • msysgit

Wheng I git commit, diyor ki:

warning: LF will be replaced by CRLF. 

Bu uyarı kuyruğu geriye mi?
Windows'da dosyayı düzenliyorum, satır sonu, CRLFtıpkı bu resim gibi:
resim açıklamasını buraya girin
Ve git LFrepo taahhüdünde bulunmak için bunu değiştirir .
Bu yüzden doğru uyarının:

warning: CRLF will be replaced by LF. 


2
@devnull Demek istediğim uyarı arkaya doğru, değil mi?
Honghe.Wu

@ Honghe.Wu Hayır, Windows'ta değil. Cevabımı aşağıda
VonC

11
Harika bir soru, çünkü uyarı geri kalmış gibi görünüyor. Bir taahhütte CRLF'ye dönüştürmeyle ilgili bu uyarıyı almak gerçekten kafa karıştırıcıdır ve Git'in boşluk alanını ele almasının açıklanmasına yardımcı olmayacaktır, çünkü uyarı geriye dönüktür .
Stijn de Witt

1
@StijndeWitt Bunu yorum yapmak için bir cevap olarak görmek isterim.
user1460043

Yanıtlar:


185

uyarı: LF, CRLF ile değiştirilecektir.

Kullandığınız düzenleyiciye bağlı olarak, LF içeren bir metin dosyası CRLF ile kaydedilmeyecektir: son düzenleyiciler eol stilini koruyabilir . Ancak bu git config ayarı bunları değiştirmekte ısrar ediyor ...

Basitçe emin olun ( burada önerdiğim gibi ):

git config --global core.autocrlf false

Bu şekilde herhangi bir otomatik dönüşümü önlersiniz ve bunları yine de bir .gitattributesdosya ve core.eolyönergeler aracılığıyla belirtebilirsiniz .


windows git "LF, CRLF ile değiştirilecek"
Bu uyarı kuyruğu geri mi?

Hayır: Windows'tasınız ve git configyardım sayfasında bahsediliyor

CRLFDepo normalleştirilmiş satır sonlarına sahip olmasa bile, çalışma dizininizde satır sonları olmasını istiyorsanız bu ayarı kullanın .

" Git yerine LF yerine CRLF yazılması " bölümünde anlatıldığı gibi, sadece kasada (taahhüt değil), ile yapılmalıdırcore.autocrlf=true .

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Bahsedildiği üzere Xiaopeng 'ın cevabı , o uyarı aynıdır:

uyarı: (Geçerli core.autocrlfyapılandırmanızla başka bir klasöre teslim ederseniz / veya kopyalarsanız ,) LF'nin yerini CRLF
alacaktır. Dosya (geçerli) çalışma dizininizde orijinal satır sonlarına sahip olacaktır.

git-for-windows/gitSayı 1242'de belirtildiği gibi :

Bu mesajın kafa karıştırıcı olduğunu düşünüyorum, mesaj sorunun daha iyi bir açıklamasını içerecek şekilde genişletilebilir, örneğin: "LF file.json, dosyayı kaldırdıktan ve tekrar kontrol ettikten sonra CRLF ile değiştirilecek ".

Not: Git 2.19 (Eylül 2018), kullanıldığında core.autocrlf, sahte "LF CRLF ile değiştirilecek" uyarısı artık engellenmektedir .


As quaylar haklı yorumlarla işlemek bir dönüşüm varsa, bu etmektir LFsadece.

Bu özel uyarı " LF will be replaced by CRLF" convert.c # check_safe_crlf () kaynağından geliyor :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

Tarafından çağrılan convert.c#crlf_to_git()kendisi tarafından çağrılan, convert.c#convert_to_git()kendisi tarafından çağrılan, convert.c#renormalize_buffer().

Ve bu sonuncusu renormalize_buffer()sadece denir merge-recursive.c#blob_unchanged().

Dolayısıyla, bu dönüşümün git commitancak söz konusu taahhüt bir birleştirme sürecinin parçasıysa gerçekleştiğinden şüpheleniyorum .


Not: Git 2.17 (Q2 2018) ile, kod temizleme bazı açıklamalar ekler.

Bakınız Torsten Bögershausen ( ) tarafından 8462ff4 (13 Ocak 2018) taahhüdütboegi .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 9bc89b1 tamamlama 2018, 13 Şubat)

convert_to_git (): safe_crlf / checksafe int dönüştürebilir

Arama yaparken convert_to_git(), checksafeparametre EOL dönüşümü ( CRLF --> LF --> CRLF) düzgün bir şekilde geri dönmezse ne olması gerektiğini tanımladı .
Ayrıca, satır sonlarının yeniden biçimlendirilmesi ( CRLF --> LF) veya olması gerektiği gibi tutulması da tanımlanmıştır .

checksafe safe_crlfşu değerlere sahip bir numaraydı :

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Git 2.17 döngüsünde 8462ff4'te (" convert_to_git(): safe_crlf/checksafeolur int conv_flags", 2018-01-13, Git 2.17.0) tanıtılan bir gerilemenin autocrlfyeniden yazmaların ayarlara rağmensafecrlf=false bir uyarı mesajı vermesine neden olduğunu unutmayın .

Bkz. Taahhüt: 6cb0912 (04 Haziran 2018) Anthony Sottile ( asottile) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 8063ff9 tamamlama 2018, 28 Haz)


1
Evet, çoğu editör EOL stilini koruyabilir, ancak çoğu editörde aynı projede yeni bir dosya oluştururken hiçbir etkisi yoktur. Bir LF projesini kontrol etmediğinizden emin olun, "psh, editörüm LF satır sonlarını işleyebilir, autocrlf'ye ihtiyacım yok" düşünün ve sonra yeni dosyaları LF satır sonlarına manuel olarak ayarlamayı unutmayın.

15
@VonC İtiraf etmeliyim ki anlamıyorum. Git-Book Git'in bunu taahhüt ettiğinizde CRLF satır sonlarını otomatik olarak LF'ye dönüştürerek ve dosya sisteminize kodu kontrol ettiğinde de tersine çevirebileceğini belirtir . Üzerindeki bu araçlar işlemek için bir dönüşüm olacak LF ve asla CRLF . Bu, belirtilen uyarının yanlış olduğu anlamına gelir. Her zaman repoda LF ve çalışma ağacında imho (Windows dışında bile) CRLF core.autocrlf=trueverecektir . Kaynak: link
quaylar

12
Ben bu kesin uyarı görüyorum "sadece kasada meydana gerekir? Bu uyarı kuyruk geriye mi" taahhüt . Yani evet , geri döndü. Geriye dönük olmak beni aramaya itti. Diğerleri de fark sevindim! Gerçekte bu uyarıları okuyan insanlar için bir taahhüt mesajı üzerinde CRLF'ye dönüşeceğini söyleyerek kafa karıştırıcı.
Stijn de Witt

7
Diyerek şöyle devam etti: "Bu yüzden bu dönüşümün yalnızca birleştirme işleminin parçası olması durumunda söz konusu taahhüt bir git işleminde gerçekleştiğinden şüpheleniyorum. Hayır! Bunu düzenli taahhütlerde görüyorum.
Stijn de Witt

3
Mesajla ilgili beni rahatsız eden kısım, hiç açılmamasıdır. neden git tam olarak ne yapılandırmak için yapılandırmak üzere olduğunu hakkında uyarılmalıdır. "Hey, bizden istediğin gibi satır sonlarını hala dönüştürüyoruz" diyen bir uyarıya ihtiyacım yok. Sistem tasarım gereği davranıyorsa, gereksiz uyarılar vermemeli veya insanlar alakasız mesajlar denizindeki önemli uyarıları kaçırmamalıdır.
Brent Larsen

27

EVET uyarı geriye dönük.

Ve aslında ilk etapta bir uyarı bile olmamalı. Çünkü tüm bu uyarı (ama ne yazık ki geriye doğru) diyor çünkü Windows satır sonları ile dosyanızdaki CRLF karakterleri yerine LF ile değiştirilmesi olacaktır. Bu, * nix ve MacOS tarafından kullanılan satır sonlarına normalize edildiği anlamına gelir.

Garip bir şey olmuyor, bu normalde isteyeceğiniz davranış.

Şu anki biçimindeki bu uyarı iki şeyden biridir:

  1. Aşırı tedbirli bir uyarı mesajı ile birlikte talihsiz bir hata veya
  2. Bunu gerçekten düşünmenizi sağlamak için çok akıllı bir arsa ...

;)


1
Garip olan şey, Windows'taki yerel dosyaları zorla LF'ye dönüştürürseniz, dosyaları eklemeye bile gidemezsiniz, mesaj şikayet eder ve taahhüdünüzü geçersiz kılar.
phpguru

24

- 9 Temmuz'da güncelleme ---

@Mgiuca tarafından yorumlandığı şekliyle "Doğru ve doğru" kaldırıldı

======

HAYIR . Şu anda dosyalarınız hakkında konuşmuyor CRLF. Bunun yerine dosyaları olanlardan bahsediyor LF.

Bunu şöyle olmalıdır:

uyarı: ( Mevcut çekirdeğinizle başka bir klasöre göz atarsanız / veya klonlarsanız. autocrlf yapılandırması ,) LF'nin yerini CRLF alır

Dosya ( geçerli ) çalışma dizininizde orijinal satır sonlarına sahip olacaktır .

Bu resim ne anlama geldiğini açıklamalıdır. resim açıklamasını buraya girin


1
Güzel illüstrasyon. +1. Daha fazla görünürlük için cevabımdaki cevabınızı referans aldım.
VonC

Benim için iyi olan şey: 1) Intellij setindeki Çizgi ayırıcıdaki core.autocrlf = false 2) (\ n). Intellij Idea'yı Mac ve Windows'ta kullanıyorum.
Xiao Peng - ZenUML.com

Dosya Windows'ta oluşturulmuş ancak bir unix / mac satır sonu (lf) olduğunda ve git config özelliğiniz autocrlf doğru olduğunda bu gerçekleşebilir. Aslında git oluşturduğunuz dosyayı değiştirmeyecek, ancak kontrol / windows satır sonları ile klonlayacak (autocrlf ayarınız nedeniyle)
Patrick

1
"Geçerli çekirdeğinizi kontrol ederseniz / veya başka bir klasöre kopyalarsanız" ile nitelemeniz gerekiyorsa uyarı nasıl doğru ve doğrudur? Orijinal mesajın söylediği bu değil. CRLF ile değiştirileceğini (belki de olmayacağını) söyleyerek, geleceğin bazı varsayımlarında değil, repo'nun kendisinde CRLF modunda saklanacağını ima ediyor.
mgiuca

12

Tüm bu varsayımlar core.autocrlf=true

Orijinal hata:

uyarı: LF, CRLF ile değiştirilecek
. Dosya, çalışma dizininizde orijinal satır sonlarına sahip olacak.

Hatanın okuması gerekenler:

uyarı: LF, çalışma dizininizde CRLF ile değiştirilecek
. Dosya , git deposunda orijinal LF satır sonlarına sahip olacak

Burada açıklama :

Bu uygun dönüşümün yan etkisi ve gördüğünüz uyarı budur, orijinal olarak yazdığınız bir metin dosyasının CRLF yerine LF sonları varsa, her zamanki gibi LF ile saklanacağı, ancak kontrol edildiğinde daha sonra CRLF sonları olacaktır. Normal metin dosyaları için bu genellikle iyidir. Uyarı bu durumda bir "bilginiz için" dir, ancak git yanlış bir ikili dosyayı bir metin dosyası olarak değerlendirirse, önemli bir uyarı çünkü git ikili dosyanızı bozar.

Temel olarak, daha önce LF olan bir yerel dosya artık yerel olarak CRLF'ye sahip olacak


7

git config --global core.autocrlf false global ayarlar için iyi çalışır.

Ancak, Visual Studio kullanıyorsanız, .gitattributesbazı proje türleri için de değişiklik yapmanız gerekebilir ( örn. C # sınıf kitaplığı uygulaması ):

  • hattı kaldır * text=auto

1

Ayarladıktan sonra bir depodaki pencerelerde dosyaları düzenlediğimde (ya da belki de açık mıydı?) core.autocrlf=true"LF CRLF ile değiştirilecek" ("CRLF LF ile değiştirilemez" notunu alıyorum) alıyordum teslim edildi LF) önce belirlediğim .git addgit commitcore.autocrlf=true

İle yeni bir ödeme yaptım core.autocrlf=trueve şimdi bu mesajları alamıyorum.


0

Visual Studio 2017, 2019 kullanıyorsanız şunları yapabilirsiniz:

  1. ana .gitignore dosyasını açın (çözümdeki diğer projelerde anothers .gitignore dosyalarını güncelleyin veya kaldırın)
  2. aşağıdaki kodu yapıştırın:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process

1
Böyle Yani "kod" oluşacağı bir yapılandırma dosyasında olmalıdır .gitconfigveya .git/configolmasın, .gitignoregit ile göz ardı hangi belirtir dosyaları.
davidA

Bunu .git / config dosyasına ekledim ama yine de "uyarı: CRLF LF ile değiştirilecek" mesajı görüntüleniyor
Sergei

0

Sadece basit bir şey yapın:

  1. Git-hub'ı (Shell) açın ve ait olduğu dizin dosyasına gidin (cd / a / b / c / ...)
  2. Dos2unix'i yürütün (bazen dos2unix.exe)
  3. Şimdi taahhütte bulunun. Aynı hatayı tekrar alırsanız. Dos2unix yerine yukarıdaki tüm adımları uygulayın, unix2dox (bazen unix2dos.exe) yapın
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.