git commit önemli hatası "fatal: CRLF, LF in ile değiştirilecek"


85

Ubuntu 13.10 x64 kullanıyorum ve bazı geliştiricilerin Windows kullandığı bir proje üzerinde çalışıyorum, yakın zamanda git yapılandırmasını core.eol"lf" ve core.autocrlf"input" ve core.safecrlf"true" olarak değiştirdim. O zamandan beri, yerel depoma dosya kaydetmeye çalıştığımda şu hatayı alıyorum:
fatal: CRLF would be replaced by LF in ......
Anladığım kadarıyla, core.eol"lf" ve core.autocrlf"input" olarak ayarlarsam , git CRLF'yi otomatik olarak LF'ye dönüştürür, ancak bu hata neden geliyor dışarı? Bu sorunu nasıl çözebilirim?

Teşekkür ederim.

Yanıtlar:


221

Bu klasik bir konudur:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(dan resim Luis Tüpler 'ın blog post )

Olağan düzeltme, bu dosyaları dos2unix veya Swiss File Knife ile kendiniz dönüştürmektir .

Hep tercih tutmak core.autocrlfiçinfalse hangi araçlarla:

git config --global core.autocrlf false

Bu hata mesajı git diffçıktıda bile ürkütüyor
VonC

8
Zaten core.autocrlfgirişi ayarladıysam git neden CRLF'yi LF olarak değiştiremiyor ?
aserww106

1
@ William çünkü Linux üzerinde ve Windows'tan gelen dosyalarla çalışıyorsunuz.
VonC

Teşekkürler @VonC, tüm dosyaları değiştirmek için zaten dos2unix kullanıyorum eol, Yani Windows geliştiricileri depolarına bazı kodlar işlediklerinde, eğer depolarından çekersem git CRLF'yi LF'ye dönüştürecek, değil mi? Git sunucumuz Ubuntu'da.
aserww106

1
@William "Yakın zamanda git config core.eol" lf"ve core.autocrlf" input"" olarak değiştirdim dediniz : bu zaten oradaki dosyaları değiştirmez. Bunun gelecek üzerinde bir etkisi olacaktır git pull. Mevcut dosyalar hala CRLF'dedir ve değiştirilirse, mümkünse LF'ye dönüştürülür ve değilse, bahsettiğiniz hata mesajını tetikler.
VonC

56

Ben de aynı sorunu yaşadım ve önerilen çözümü başarılı olmadan denedim.

Çalışması için ikinci bir komut yürütmem gerekiyordu:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false

5
Bu fazladan düzenlemenin herhangi bir olumsuz etkisi var mı?
AlleyOOP

28
$ git config core.autocrlf false

3
Bunun ne yaptığını bilmiyorum ama işe yarıyor. Ölümcül uyarı ortadan kalkıyor ve artık korkmuyorum.
wh1tney

Bunu yaptım ve şimdi git difftüm dosyamı (1000 satır) bir çakışma olarak görüyorum . Dif araçları yalnızca 3 satır değişikliği görür.
Dagrooms

10

Dos2unix'i deneyebilirsiniz:

dos2unix [filename]

5

Bu binlerce dosyada başıma geldi. Bu yüzden benim için dos2unixdüzeltmek için hızlı bir bash betiği yazdım . Linux veya Mac'te başka biri onu faydalı bulabilir.

#!/usr/bin/env bash

unwindows() {

  local errmsg
  local fpath

  # base case
  errmsg="$(git add . 2>&1)"
  if [[ $? -eq 0 ]]; then
    echo 'Successfully converted CRLF to LF in all files.'
    echo 'Successfully ran "git add .".'
    echo 'Done.'
    return 0
  fi

  fpath="${errmsg#*fatal: CRLF would be replaced by LF in }"
  fpath="${fpath%.*}"

  if [[ "${fpath}" == "${errmsg}" ]]; then
    err 'Regex failed. Could not auto-generate filename from stderr.'
    return 1
  fi

  if [[ ! -e "${fpath}" ]]; then
    err "Regex failed. '${fpath}' does not exist."
    return 1
  fi

  if ! dos2unix "${fpath}"; then
    err "Failed to run \"dos2unix '${fpath}'\"."
    return 1
  fi

  # recursive case
  unwindows
}

err() {
  local -r msg="$1"
  echo "${msg}" >&2
}

unwindows

Temelde yapmaya çalışır git add .. Komut başarısız olursa, uyumsuz dosyanın adını hata çıktısından alır. Sonra o dos2unixdosya üzerinde çalışır . Çalışana kadar bu süreci tekrar etmeye devam ediyor git add ..

Bunu çalıştırırsanız, dos2unix: converting file xxx to Unix format...tekrar tekrar görmelisiniz . Eğer yapmazsanız, çalışmaz, bu yüzden durdurmak için ctrl+ cveya command+ tuşlarına basmanız yeterlidir c.


2
Binlerce taahhüt edilmemiş dosyayı nasıl toplayabildiğimi merak eden biri varsa, bunun nedeni depoda kodla oluşturulmuş bir sürü görüntüye sahip olmasıdır. Bir taahhüdü falan 3 yıl ertelemedim.
GreenRaccoon23

1

git statusDeğiştirilmiş olarak görüntülenen tüm dosyaları eklemeniz gerekir :

git add file1
git add file2

Ve sonra değişikliklerinizi uygulayın:

git commit

Bu, yerel dosyalarınızı olduğu gibi tutacak, ancak autocrlfonları uzak depoda tutacaktır .


1

Aynı sorunla karşılaştım ve .gitattributesaşağıdaki gibi düzenleme ile düzeldim .

$ vim .gitattributes

.gitattributes'da 2 satırı açıklama

-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf

1

Bilginize Bunun sizin için geçerli olup olmadığından emin değilim, ancak yanlışlıkla tüm node_modulesaşamalı değişikliklere eklemeye çalışırken bu hatayı alıyordum . Yani aslında benim sorun çözüldü..gitignoringnode_modules


0

Terminal kullanarak bir Mac kullanıyorum ve işlemeye çalıştığım bir .htaccess dosyasıyla bu sorunu yaşadım, ölümcül hatayı alıyorum:

fatal: CRLF would be replaced by LF in .htaccess

OP istekleri gibi sorunu düzeltmek istedim, sadece git bayrağını kapatmak değil, bu yüzden sorunu dosya başına çözmek için bir perl komutu veren bu makaleyi buldum .

perl -pi -e 's/\r\n/\n/g' input.file

Bu yüzden yukarıdaki .htaccess hatam için aşağıdakileri çalıştırdım:

perl -pi -e 's/\r\n/\n/g' .htaccess 

Komut satırından Perl kullanarak dosyaları düzenlemenize izin vermek için -p, -i ve -e (pasta) bayrakları birleştirilebilir. Bu durumda, bulunan tüm \ r \ n \ n ile değiştirilir.

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.