คอมมิตคอมมิตรับข้อผิดพลาดร้ายแรง“ ร้ายแรง: CRLF จะถูกแทนที่ด้วย LF in”


85

ฉันใช้ Ubuntu 13.10 x64 และฉันกำลังทำโปรเจ็กต์ที่นักพัฒนาบางคนใช้ Windows อยู่ฉันเพิ่งเปลี่ยนการกำหนดค่าคอมไพล์core.eolเป็น "lf" และcore.autocrlfเป็น "อินพุต" และcore.safecrlfเป็น "จริง" ตั้งแต่นั้นมาเมื่อฉันพยายามคอมมิตไฟล์ลงในที่เก็บในเครื่องฉันได้รับข้อผิดพลาดนี้:
fatal: CRLF would be replaced by LF in ......
จากสิ่งที่ฉันเข้าใจถ้าฉันตั้งค่าcore.eolเป็น "lf" และcore.autocrlfเป็น "อินพุต" git จะแปลง CRLF เป็น LF โดยอัตโนมัติ แต่เหตุใดจึงเกิดข้อผิดพลาดนี้ ออก? ฉันจะแก้ไขปัญหานี้ได้อย่างไร?

ขอขอบคุณ.

คำตอบ:


221

นี่เป็นปัญหาคลาสสิก:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(ภาพจากหลุยส์ท่อ 's บล็อกโพสต์ )

การแก้ไขตามปกติคือการแปลงไฟล์ที่ตัวเองมีdos2unixหรือสวิสมีดไฟล์

ผมได้แนะนำเสมอที่จะให้core.autocrlfไปfalseซึ่งหมายถึง:

git config --global core.autocrlf false

ข้อความแสดงข้อผิดพลาดนั้นยังคืบคลานเข้ามาในgit diffเอาต์พุต: git.661346.n2.nabble.com/…
VonC

8
ทำไม git ไม่สามารถเปลี่ยน CRLF เป็น LF ให้ฉันได้ถ้าฉันตั้งค่าcore.autocrlfเป็นอินพุตแล้ว
aserww106

1
@ วิลเลียมเพราะคุณทำงานบน Linux และไฟล์ที่มาจาก Windows
VonC

ขอบคุณ @VonC ฉันใช้ dos2unix เพื่อเปลี่ยนไฟล์ทั้งหมดแล้วดังนั้นเมื่อนักพัฒนา Windows ส่งรหัสบางส่วนไปยังที่เก็บของพวกเขาถ้าฉันดึงจากที่เก็บ git จะแปลง CRLF เป็น LF ใช่ไหม เซิร์ฟเวอร์ git ของเราอยู่บน Ubuntu
aserww106

1
@ วิลเลียมฉันหมายความว่าคุณพูดว่า "ฉันเพิ่งเปลี่ยนเป็นgit config core.eol" lf"และcore.autocrlfเป็น" input"" ซึ่งไม่ได้เปลี่ยนไฟล์ที่มีอยู่แล้ว git pullที่จะมีผลกระทบต่ออนาคต ไฟล์ปัจจุบันยังอยู่ใน CRLF และหากมีการแก้ไขจะถูกแปลงเป็น LF หากเป็นไปได้และหากไม่เป็นเช่นนั้นจะทริกเกอร์ข้อความแสดงข้อผิดพลาดที่คุณกล่าวถึง
VonC

56

ฉันมีปัญหาเดียวกันและลองวิธีแก้ปัญหาที่แนะนำแล้ว แต่ไม่ประสบความสำเร็จ

ฉันต้องรันคำสั่งที่สองเพื่อให้มันใช้งานได้:

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

5
มีการแบ่งส่วนเชิงลบสำหรับการแก้ไขเพิ่มเติมนี้หรือไม่
AlleyOOP

28
$ git config core.autocrlf false

3
ฉันไม่รู้ว่ามันทำอะไร แต่ได้ผล คำเตือนร้ายแรงหายไปและฉันไม่กลัวอีกต่อไป
wh1tney

ฉันทำสิ่งนี้และตอนนี้git diffเห็นไฟล์ทั้งหมดของฉัน (1,000 บรรทัด) เป็นข้อขัดแย้ง เครื่องมือ diff จะเห็นการเปลี่ยนแปลง 3 บรรทัดเท่านั้น
Dagrooms


5

สิ่งนี้เกิดขึ้นกับฉันในไฟล์หลายพันไฟล์ ดังนั้นฉันจึงเขียนสคริปต์ทุบตีอย่างรวดเร็วเพื่อdos2unixแก้ไขให้ฉัน คนอื่นบน Linux หรือ Mac อาจพบว่ามีประโยชน์

#!/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

git add .โดยทั่วไปก็พยายามที่จะทำ หากคำสั่งล้มเหลวคำสั่งจะดึงชื่อของไฟล์ที่เข้ากันไม่ได้จากเอาต์พุตข้อผิดพลาด จากนั้นจะทำงานdos2unixบนไฟล์นั้น ทำซ้ำขั้นตอนนี้ไปเรื่อย ๆ จนกว่าจะได้git add .ผล

หากคุณเรียกใช้สิ่งนี้คุณควรเห็นdos2unix: converting file xxx to Unix format...ซ้ำ ๆ ถ้าไม่ทำแสดงว่าไม่ทำงานให้กดctrl+ cหรือcommand+ cเพื่อหยุด


2
ในกรณีที่มีใครสงสัยว่าฉันจัดการไฟล์ที่ไม่ได้ผูกมัดหลายพันไฟล์ได้อย่างไรเนื่องจาก repo มีภาพที่สร้างรหัสจำนวนมาก ฉันไม่ได้เลื่อนการกระทำเป็นเวลา 3 ปีหรืออะไรเลย
GreenRaccoon23

1

คุณต้องเพิ่มไฟล์ทั้งหมดที่git statusแสดงว่าแก้ไขแล้ว:

git add file1
git add file2

จากนั้นทำการเปลี่ยนแปลงของคุณ:

git commit

สิ่งนี้จะเก็บไฟล์ในเครื่องของคุณตามที่เป็นอยู่ แต่จะเก็บautocrlfไว้ในที่เก็บระยะไกล


1

ฉันประสบปัญหาเดียวกันและแก้ไขด้วยการแก้ไข.gitattributesดังต่อไปนี้

$ vim .gitattributes

แสดงความคิดเห็น 2 บรรทัดใน. gitattributes

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

1

ฉันไม่แน่ใจว่าสิ่งนี้ใช้ได้กับคุณหรือไม่ แต่ฉันได้รับข้อผิดพลาดนี้เมื่อพยายามเพิ่มทั้งหมดnode_modulesลงในการเปลี่ยนแปลงทีละขั้นโดยไม่ได้ตั้งใจ จริงๆแล้ว.gitignoringวิธีnode_modulesแก้ปัญหาของฉัน


0

ฉันใช้ Mac โดยใช้ Terminal และมีปัญหากับไฟล์. htaccess ที่ฉันพยายามจะส่งข้อผิดพลาดร้ายแรง:

fatal: CRLF would be replaced by LF in .htaccess

ฉันต้องการแก้ไขปัญหาเช่นคำขอ OP ไม่ใช่แค่ปิดแฟล็กคอมไพล์ดังนั้นฉันจึงพบบทความนี้ที่ให้คำสั่ง perl เพื่อแก้ไขปัญหาทีละไฟล์

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

ดังนั้นสำหรับข้อผิดพลาด. htaccess ของฉันด้านบนฉันเรียกใช้สิ่งต่อไปนี้:

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

แฟล็ก -p, -i และ -e (พาย) สามารถรวมกันเพื่อให้คุณแก้ไขไฟล์โดยใช้ Perl จากบรรทัดรับคำสั่ง ในกรณีนี้แทนที่ \ r \ n ทั้งหมดที่พบด้วย \ n

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.