git แทนที่ LF ด้วย CRLF


839

ใช้งานคอมไพล์บนเครื่อง Windows XP โดยใช้ bash ฉันส่งออกโครงการของฉันจาก SVN แล้วโคลนที่เก็บข้อมูลเปลือย

จากนั้นฉันวางการส่งออกไปยังไดเรกทอรีที่เก็บเปลือยและทำ:

git add -A

ฉันได้รับข้อความว่า:

LF จะถูกแทนที่ด้วย CRLF

อะไรคือการเปลี่ยนแปลงของการแปลงนี้ นี่คือโซลูชัน. NET ใน Visual Studio


14
@apphacker เนื่องจากการวางบรรทัดบรรทัดมาตรฐานทำให้รำคาญน้อยกว่าการเปลี่ยนด้วยตนเองเมื่อกระจายไฟล์สองไฟล์ (และแน่นอนถ้าคุณไม่เห็นด้วยคุณสามารถปิดคุณสมบัติ core.autocrlf ได้)
RJFalconer

2
เหตุใดการสิ้นสุดของบรรทัดจะแตกต่างกันเว้นแต่จะมีการแตะทั้งบรรทัด
Bjorn

3
ฉันมักจะสัมผัสหลายบรรทัดเพราะฉันกำลังทดลองกับแนวคิดที่แตกต่างเพิ่มคำสั่งการติดตามเพื่อดูว่ามันทำงานอย่างไร ฯลฯ จากนั้นฉันอาจต้องการเปลี่ยนแปลงเพียงสองหรือสามบรรทัดและให้คอมไพล์ไม่สนใจคนอื่นเพราะฉัน ได้นำพวกเขากลับมาในแบบที่ฉันพบพวกเขา (หรือฉันคิดว่า)
MatrixFrog

5
@MatrixFrog: เครื่องมือแก้ไขของคุณดูเหมือนว่าไม่สามารถตรวจจับจุดสิ้นสุดของบรรทัดได้โดยอัตโนมัติ มันคืออะไร ฉันทำงานในโครงการไฮบริดซึ่งต้องมีไฟล์ LF และไฟล์ CRLF อื่น ๆ ใน repo เดียวกัน ไม่มีปัญหาสำหรับบรรณาธิการสมัยใหม่ การมีเวอร์ชันการควบคุม (หรือการถ่ายโอนไฟล์) มีความยุ่งเหยิงกับการสิ้นสุดบรรทัดเพื่อแก้ไขข้อ จำกัด ของตัวแก้ไขเป็นความคิดที่เลวร้ายที่สุด - ชัดเจนจากความยาวของคำอธิบายด้านล่าง
MarcH

4
โปรแกรมแก้ไขสมัยใหม่ที่ฉันรู้เท่านั้นว่าสิ่งที่ผิดคือ Visual Studio Visual Studio จะเปิดไฟล์อย่างมีความสุขที่ปลายสาย LF หากคุณแทรกบรรทัดใหม่มันจะแทรก CRLF และบันทึกจุดสิ้นสุดของบรรทัดแบบผสม Microsoft ปฏิเสธที่จะแก้ไขปัญหานี้ซึ่งเป็นรอยที่ค่อนข้างใหญ่บน IDE ที่ค่อนข้างดี: - (
Jon Watte

คำตอบ:


956

ข้อความเหล่านี้เกิดจากค่าเริ่มต้นที่ไม่ถูกต้องของcore.autocrlfบน Windows

แนวคิดของautocrlfคือการจัดการการแปลงปลายสายอย่างโปร่งใส และมันก็เป็นเช่นนั้น!

ข่าวร้าย : ต้องกำหนดค่าด้วยตนเอง
ข่าวดี : มันควรจะทำเพียงครั้งเดียวต่อการติดตั้งคอมไพล์ (ต่อการตั้งค่าโครงการก็เป็นไปได้)

วิธีautocrlfการทำงาน :

core.autocrlf=true:      core.autocrlf=input:     core.autocrlf=false:

        repo                     repo                     repo
      ^      V                 ^      V                 ^      V
     /        \               /        \               /        \
crlf->lf    lf->crlf     crlf->lf       \             /          \      
   /            \           /            \           /            \

ที่นี่crlf= เครื่องหมายระบุจุดสิ้นสุดของรูปแบบ win-style lf= unix-style (และ mac osx)

(pre-osx crไม่ได้รับผลกระทบใด ๆ จากสามตัวเลือกด้านบน)

คำเตือนนี้ปรากฏขึ้นเมื่อใด (ใต้ Windows)

    - autocrlf= trueถ้าคุณมีรูปแบบยูนิกซ์lfในไฟล์ใดไฟล์หนึ่งของคุณ (= RARELY)
    - autocrlf= inputหากคุณมีรูปแบบวินเป็นcrlfหนึ่งในไฟล์ของคุณ (= เกือบตลอดเวลา)
    - autocrlf= false- ไม่เคย!

คำเตือนนี้หมายถึงอะไร

คำเตือน " LF จะถูกแทนที่ด้วย CRLF " บอกว่าคุณ (มีautocrlf= true) จะสูญเสีย LF ในยูนิกซ์สไตล์ของคุณหลังจากเสร็จสิ้นการชำระเงิน (มันจะถูกแทนที่ด้วย CRLF สไตล์ Windows) Git ไม่ได้คาดหวังให้คุณใช้ LF แบบ unix ในหน้าต่าง

คำเตือน " CRLF จะถูกแทนที่ด้วย LF " บอกว่าคุณ (มีautocrlf= input) จะสูญเสีย CRLF สไตล์หน้าต่างของคุณหลังจากรอบการยอมรับการชำระเงิน (มันจะถูกแทนที่ด้วย LF สไตล์ unix) อย่าใช้ในinputหน้าต่าง

อีกวิธีหนึ่งในการแสดงว่าautocrlfทำงานอย่างไร

1) true:             x -> LF -> CRLF
2) input:            x -> LF -> LF
3) false:            x -> x -> x

โดยที่xคือ CRLF (windows-style) หรือ LF (unix-style) และลูกศรหมายถึง

file to commit -> repository -> checked out file

วิธีแก้ไข

เลือกค่าเริ่มต้นสำหรับcore.autocrlfระหว่างการติดตั้ง git และเก็บไว้ใน gitconfig ( %ProgramFiles(x86)%\git\etc\gitconfig) ทั้งระบบ ยังมี (เรียงตามลำดับต่อไปนี้):

   - "ทั่วโลก" (ต่อผู้ใช้) ตั้งอยู่ที่ gitconfig ~/.gitconfigยังอีก
   - "ทั่วโลก" gitconfig (ต่อผู้ใช้) ที่$XDG_CONFIG_HOME/git/configหรือ$HOME/.config/git/configและ
   - "ท้องถิ่น" (ต่อ repo) gitconfig ที่.git/configใน dir ทำงาน

ดังนั้นเขียนgit config core.autocrlfใน dir ทำงานเพื่อตรวจสอบค่าที่ใช้ในปัจจุบันและ

   - เพิ่มautocrlf=falseไปยังระบบ gitconfig # ต่อโซลูชันระบบ
   - git config --global core.autocrlf false            # โซลูชั่นต่อผู้ใช้
   - git config --local core.autocrlf false              # โซลูชั่นต่อโครงการ

คำเตือน
- git configการตั้งค่าสามารถแทนที่ได้ด้วยgitattributesการตั้งค่า
- crlf -> lfการแปลงจะเกิดขึ้นเมื่อเพิ่มไฟล์ใหม่ไฟล์crlfที่มีอยู่แล้วใน repo จะไม่ได้รับผลกระทบ

คุณธรรม (สำหรับ Windows):
    - ใช้core.autocrlf= trueถ้าคุณวางแผนที่จะใช้โครงการนี้ภายใต้ระบบปฏิบัติการยูนิกซ์เช่นกัน (และไม่เต็มใจที่จะกำหนดค่าเครื่องมือแก้ไข / IDE ของคุณให้ใช้ปลายสายยูนิกซ์)
    - ใช้core.autocrlf= falseถ้าคุณวางแผนที่จะใช้โครงการนี้ใน Windows เท่านั้น ( หรือคุณได้กำหนดค่าเครื่องมือแก้ไข / IDE ของคุณให้ใช้จุดสิ้นสุดบรรทัด unix)
    - ห้ามใช้core.autocrlf= inputเว้นแต่คุณจะมีเหตุผลที่ดีในการ ( เช่นถ้าคุณใช้ยูทิลิตี unix ใน windows หรือหากคุณพบปัญหาเกี่ยวกับ makefiles)

PS มีอะไรให้เลือกบ้างเมื่อติดตั้ง git สำหรับ Windows
หากคุณจะไม่ใช้โครงการใด ๆ ภายใต้ระบบปฏิบัติการยูนิกซ์อย่าเห็นด้วยกับตัวเลือกแรกที่เป็นค่าเริ่มต้น เลือกรายการที่สาม ( ชำระเงินตามสภาพ, กระทำตามสภาพ ) คุณจะไม่เห็นข้อความนี้ เคย

ความชอบส่วนบุคคล PPS ของฉันคือการกำหนดค่าบรรณาธิการ / IDEใช้ปลาย Unix สไตล์และการตั้งค่าไปcore.autocrlffalse


28
สำหรับระยะเวลาที่ฉันได้ใช้เวลาที่จะได้รับมาไกลขนาดนี้ผมก็หวังสำหรับ core.crlf = rackoff ;-)
PandaWood

10
ฉันปรับโครงสร้างเนื้อหาบางทีการอ่านแบบนี้อาจจะง่ายขึ้น
Antony Hatchkins

7
ขออภัยฉันหวังว่าความคิดเห็นของฉันไม่ได้เป็นคำวิจารณ์ของคุณ โดย "เพื่อให้ได้ไกล" ฉันหมายถึงก่อนที่จะหาคำตอบนี้
PandaWood

10
นี่คือความสับสน ฉันตั้งค่า LF ในเครื่องมือแก้ไขแล้ว รหัสซื้อคืนทั้งหมดใช้ LF global autocrlf ถูกตั้งค่าเป็นเท็จและ core gitconfig ใน dir บ้านของฉันถูกตั้งค่าเป็นเท็จ แต่ฉันยังคงได้รับข้อความ LF ถูกแทนที่ด้วย CRLF
isimmons

17
หากคุณกำหนดค่าตัวแก้ไขให้ใช้การสิ้นสุดสไตล์ Unix ทำไมไม่ตั้งค่าcore.autocrlfให้ป้อนข้อมูล จากสิ่งที่ฉันรวบรวมจากคำตอบของคุณการตั้งค่าเป็นอินพุตทำให้แน่ใจว่าที่เก็บและไดเร็กทอรีการทำงานมีการสิ้นสุดบรรทัดแบบยูนิกซ์เสมอ ทำไมคุณไม่ต้องการใน Windows
Hubro

764

Git มีสามโหมดว่าจะจัดการกับการสิ้นสุดบรรทัดอย่างไร:

$ git config core.autocrlf
# that command will print "true" or "false" or "input"

คุณสามารถตั้งค่าโหมดที่จะใช้โดยการเพิ่มพารามิเตอร์เพิ่มเติมtrueหรือfalseไปยังบรรทัดคำสั่งด้านบน

หากcore.autocrlfตั้งค่าเป็นจริงนั่นหมายความว่าเมื่อใดก็ตามที่คุณเพิ่มไฟล์ลงใน git repo ที่ git คิดว่าเป็นไฟล์ข้อความมันจะเปลี่ยนปลายสาย CRLF ทั้งหมดเป็นเพียง LF ก่อนที่มันจะเก็บไว้ในการกระทำ เมื่อใดก็ตามที่คุณทำgit checkoutสิ่งใดไฟล์ข้อความทั้งหมดจะมีการแปลงตอนจบบรรทัด LF เป็นตอนจบ CRLF สิ่งนี้ช่วยให้การพัฒนาโครงการข้ามแพลตฟอร์มที่ใช้รูปแบบการสิ้นสุดบรรทัดที่แตกต่างกันโดยไม่ต้องทำเสียงดังมากเพราะบรรณาธิการแต่ละคนจะเปลี่ยนรูปแบบการสิ้นสุดของบรรทัด

ผลข้างเคียงของการแปลงที่สะดวกนี้และนี่คือสิ่งที่คำเตือนที่คุณเห็นเป็นเรื่องเกี่ยวกับว่าถ้าไฟล์ข้อความที่คุณประพันธ์มีตอนจบ LF แทน CRLF มันจะถูกเก็บไว้กับ LF ตามปกติ แต่เมื่อตรวจสอบแล้ว ออกมาภายหลังจะมีตอนจบ CRLF สำหรับไฟล์ข้อความปกตินี่เป็นเรื่องปกติ คำเตือนคือ "สำหรับข้อมูลของคุณ" ในกรณีนี้ แต่ในกรณีที่คอมไพล์ประเมินไฟล์ไบนารี่ไม่ถูกต้องให้เป็นไฟล์ข้อความคำเตือนที่สำคัญเพราะคอมไพล์จะทำให้ไฟล์ไบนารีของคุณเสียหาย

หากcore.autocrlfตั้งค่าเป็นเท็จจะไม่มีการแปลงบรรทัดสิ้นสุดดังนั้นไฟล์ข้อความจะถูกตรวจสอบตามสภาพ โดยปกติแล้วจะใช้ได้ดีตราบใดที่นักพัฒนาซอฟต์แวร์ของคุณทั้งบน Linux หรือบน Windows แต่จากประสบการณ์ของฉันฉันยังคงมีแนวโน้มที่จะได้รับไฟล์ข้อความที่ลงท้ายด้วยเส้นผสมที่ท้ายทำให้เกิดปัญหา

การตั้งค่าส่วนตัวของฉันคือการเปิดการตั้งค่าไว้ในฐานะนักพัฒนา Windows

ดูhttp://kernel.org/pub/software/scm/git/docs/git-config.htmlสำหรับข้อมูลที่อัปเดตซึ่งมีค่า "อินพุต"


116
ดังที่กล่าวไว้ที่นี่ ( stackoverflow.com/questions/1249932/… ) ฉันจะไม่เห็นด้วยอย่างเคารพและออกจากการตั้งค่าที่ปิด (และใช้ Notepad ++ หรือบรรณาธิการอื่น ๆ ที่สามารถจัดการกับ - และออกตามที่มันเป็น - สิ่งที่ตัวละครบรรทัดปลาย พบ)
VonC

23
ฉันชอบคำตอบนี้และต้องการปล่อยให้ autocrlf ตั้งค่าเป็นจริง มีวิธีฆ่าข้อความเตือนโดยอัตโนมัติหรือไม่?
Krisc

12
มันเป็นการดีที่จะเพิ่มคำตอบที่เขียนขึ้นนี้ด้วยการเปรียบเทียบกับการcore.eolตั้งค่าบางทีในคอนเสิร์ตที่มี.gitattributesการกำหนดค่า ฉันพยายามที่จะหาความแตกต่างและทับซ้อนกันผ่านการทดลองและมันสับสนมาก
seh

5
สำหรับโซลูชันที่ถาวรมากขึ้นให้เปลี่ยน. gitconfig เป็น: [core] autocrlf = false
RBZ

9
มีวิธีง่าย ๆ เพียงแค่บีบคำเตือนหรือไม่ ฉันต้องการให้มันเป็นจริงและรู้ว่าฉันได้ตั้งเป็นจริง ฉันไม่จำเป็นต้องเห็นคำเตือนทั้งหมดตลอดเวลา ... มันก็โอเคจริง ๆ ... : p
UmaN

159

หากคุณตรวจสอบรหัสแล้วไฟล์จะถูกทำดัชนีแล้ว หลังจากเปลี่ยนการตั้งค่าคอมไพล์แล้วให้พูดโดยเรียกใช้:

git config --global core.autocrlf input 

คุณควรรีเฟรชดัชนีด้วย

git rm --cached -r . 

และเขียนดัชนีคอมไพล์อีกครั้งด้วย

git reset --hard

https://help.github.com/articles/dealing-with-line-endings/#refreshing-a-repository-after-changing-line-endings

หมายเหตุ: นี่จะเป็นการลบการเปลี่ยนแปลงในเครื่องของคุณให้พิจารณาการลบทิ้งก่อนที่คุณจะทำสิ่งนี้


23
ขอบคุณสำหรับการข้ามแพลตฟอร์มที่เรียบง่ายวิธีที่ชัดเจนในการแก้ไขปัญหาแทนที่จะเป็นการอภิปรายขนาดใหญ่เกี่ยวกับความหมายของการกำหนดค่า
Eris

2
ถ้ารีเซ็ต git - มันเป็นไปได้ไหมที่การเปลี่ยนแปลงในท้องถิ่นของฉันจะหายไป? ฉันเพียงแค่ทำตามความคิดเห็นทั้งหมด metion ดังกล่าวข้างต้น
Freddy Sidauruk

5
ใช่การเปลี่ยนแปลงในท้องถิ่นของคุณจะหายไป พารามิเตอร์ - ฮาร์ดรีเซ็ตดัชนีและแผนผังการทำงานเพื่อให้การเปลี่ยนแปลงใด ๆ กับไฟล์ที่ถูกติดตามจะถูกยกเลิก git-scm.com/docs/git-reset
Jacques

2
ความหมายคืออะไรgit rm --cached -r .? ทำไมgit reset --hardยังไม่พอ
gavenkoa

2
@gavenkoa @max คุณต้องการgit rm --cached -r .หากคุณทำgit reset --hardหลังจากเปลี่ยนการcore.autocrlfตั้งค่ามันจะไม่แปลงการสิ้นสุดบรรทัดอีกครั้ง คุณต้องทำความสะอาดดัชนี git
wisbucky

80
git config core.autocrlf false

6
ตรวจสอบให้แน่ใจว่าได้รันรูทของที่เก็บข้อมูลภายใน
Hammad Khan

23
ฉันไม่เข้าใจว่าสิ่งนี้มีประโยชน์อย่างไร คนครึ่งหนึ่งต้องการให้ autocrlf เป็นจริงเพื่อให้มันทำงานได้อีกครึ่งหนึ่งต้องการให้เป็นเท็จ / อินพุต ดังนั้นสิ่งที่พวกเขาควรจะสุ่มคำตอบแบบครั้งเดียวเหล่านี้ลงบนผนังคอนโซลของพวกเขาจนกว่าสิ่งที่ sticks และ sorta "งาน"? สิ่งนี้ไม่ได้ผล
Zoran Pavlovic

ฉันได้รับข้อผิดพลาด "ร้ายแรง: ไม่อยู่ในไดเรกทอรี git" ฉันพยายาม cd ไปที่ C: \ Program Files \ Git และ C: \ Program Files \ Git \ bin
pixelwiz

2
@mbb การตั้งค่าautcrlfที่จะfalseเพียงเรือท้องแบนปัญหาให้กับผู้ใช้ของโครงการของคุณทุกคน
jpaugh

5
@pixelwiz: คำสั่งนี้ตั้งค่าคุณสมบัติสำหรับโครงการเท่านั้น (ดังนั้นคุณต้องอยู่ภายใต้ที่เก็บ git เพื่อเรียกใช้) หากคุณต้องการตั้งค่านี้ทั่วโลกให้ใช้git config --global core.autocrlf falseแทน
Michaël Polla

49

ทั้งunix2dosและdos2unixมีอยู่ใน windows ด้วย gitbash คุณสามารถใช้คำสั่งต่อไปนี้เพื่อทำการแปลง UNIX (LF) -> DOS (CRLF) ดังนั้นคุณจะไม่ได้รับคำเตือน

unix2dos filename

หรือ

dos2unix -D filename

แต่อย่ารันคำสั่งนี้กับไฟล์ CRLF ใด ๆ ที่มีอยู่จากนั้นคุณจะได้รับบรรทัดใหม่ที่ว่างเปล่าทุกบรรทัดที่สอง

dos2unix -D filenameจะไม่ทำงานกับทุกระบบปฏิบัติการ กรุณาตรวจสอบลิงค์นี้เพื่อความเข้ากันได้

--forceหากมีเหตุผลบางอย่างที่คุณจะต้องบังคับคำสั่งแล้วใช้ -fหากจะกล่าวว่าการใช้งานที่ไม่ถูกต้องแล้ว


8
มันทำอะไร?
Salman von Abbas

1
นี่คือสิ่งที่ตัวเลือกความช่วยเหลือพูดว่า: `- u2d, -D ดำเนินการ UNIX -> การแปลง DOS '
Larry Battle

1
@Rifat ฉันสับสน ความคิดเห็นของคุณบอกว่าdos2unix -Dจะแปลงปลายหน้าต่างบรรทัดเป็นปลายสาย linux ไม่เหมือนกับการแปลง DOS (CRLF) -> UNIX (LF) อย่างไรก็ตามdos2unix -hระบุว่า-Dจะทำการแปลง UNIX (LF) -> DOS (CRLF) dos2unix ข้อมูลเพิ่มเติม: gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unix
Larry Battle

1
@ LarryBattle ใช่คุณพูดถูก -D จริงๆแล้วฉันโพสต์คำตอบเมื่อฉันเป็นผู้ใช้ windows และฉันได้แสดงความคิดเห็นมากกว่าหนึ่งปีต่อมาเมื่อฉันเป็นผู้ใช้ Mac: D BTW ขอบคุณสำหรับการชี้แจง
Rifat

1
สิ่งนี้ใช้ได้สำหรับฉัน ฉันใช้ Cygwin ซึ่งดูเหมือนจะไม่สนับสนุนสวิตช์ -D - แต่มีคำสั่ง "unix2dos" ซึ่งทำสิ่งเดียวกัน ฉันหวังว่าฉันจะรู้ว่าสิ่งที่ทำให้เกิดปัญหาแม้ว่า - ฉันมี core.autocrlf = false และมันเป็นที่เก็บของ Windows เท่านั้น
Richard Beier

28

ฉันคิดว่าคำตอบของ @ Basiloungas ใกล้เคียง แต่ล้าสมัย (อย่างน้อยบน Mac)

เปิดไฟล์ ~ / .gitconfig และตั้งค่าsafecrlfเป็นเท็จ

[core]
       autocrlf = input
       safecrlf = false

นั่นจะทำให้มันไม่สนใจจุดจบของบรรทัด (เห็นได้ชัดว่าเหมาะสำหรับฉัน)


1
มันควรจะเป็นsafecrlf(ด้วย 'f')
alpipego

22

บทความ GitHub บนปลายสายเป็นที่กล่าวถึงกันทั่วไปเมื่อพูดคุยเกี่ยวกับหัวข้อนี้

ประสบการณ์ส่วนตัวของฉันเกี่ยวกับการใช้การcore.autocrlfตั้งค่าการตั้งค่าที่แนะนำบ่อย ๆนั้นหลากหลายมาก

ฉันใช้ Windows กับ Cygwin ซึ่งเกี่ยวข้องกับโครงการ Windows และ UNIX ในเวลาที่ต่างกัน แม้แต่โครงการ Windows ของฉันบางครั้งก็ใช้bashเชลล์สคริปต์ซึ่งต้องการจุดสิ้นสุดบรรทัด UNIX (LF)

ใช้การcore.autocrlfตั้งค่าที่แนะนำของ GitHub สำหรับ Windows ถ้าฉันดูโครงการ UNIX (ซึ่งทำงานได้อย่างสมบูรณ์บน Cygwin - หรือบางทีฉันมีส่วนร่วมในโครงการที่ฉันใช้บนเซิร์ฟเวอร์ Linux) ไฟล์ข้อความจะถูกตรวจสอบด้วย Windows (CRLF ) การสิ้นสุดบรรทัดสร้างปัญหา

โดยพื้นฐานแล้วสำหรับสภาพแวดล้อมแบบผสมอย่างที่ฉันมีการตั้งค่าโกลบอลcore.autocrlfเป็นตัวเลือกใด ๆ จะไม่ทำงานได้ดีในบางกรณี ตัวเลือกนี้อาจถูกตั้งค่าบนการกำหนดค่า git ในพื้นที่ (ที่เก็บ) แต่ก็ไม่ดีพอสำหรับโครงการที่มีทั้งที่เกี่ยวข้องกับ Windows และ UNIX (เช่นฉันมีโครงการ Windows ที่มีbashสคริปต์อรรถประโยชน์บางตัว)

ตัวเลือกที่ดีที่สุดที่ฉันพบคือการสร้างไฟล์. gitattributesต่อที่เก็บ บทความ GitHubกล่าวถึงมัน
ตัวอย่างจากบทความนั้น:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

ในที่เก็บโครงการหนึ่งของฉัน:

* text=auto

*.txt         text eol=lf
*.xml         text eol=lf
*.json        text eol=lf
*.properties  text eol=lf
*.conf        text eol=lf

*.awk  text eol=lf
*.sed  text eol=lf
*.sh   text eol=lf

*.png  binary
*.jpg  binary

*.p12  binary

การตั้งค่าเป็นเรื่องเล็ก ๆ น้อย ๆ แต่ทำครั้งเดียวต่อโครงการและผู้มีส่วนร่วมในระบบปฏิบัติการใด ๆ ไม่ควรมีปัญหากับการสิ้นสุดบรรทัดเมื่อทำงานกับโครงการนี้


พบกับสิ่งนี้ได้ในขณะนี้พยายามจัดการ repo ด้วยสคริปต์ Cygwin ท่ามกลางไฟล์ข้อความพื้นฐานอื่น ๆ คุณจะจัดการกับไฟล์ที่ไม่มีนามสกุลได้อย่างไร (เช่น "fstab", "sshd_config") บทความที่เชื่อมโยงไม่ครอบคลุมถึงสถานการณ์นั้น
Mike Loux

1
@MikeLoux ลองใช้วิธีนี้: stackoverflow.com/a/44806034/4377192
Gene Pavlovsky

ฉันพบว่าการทำงานค่อนข้างคล้ายกับtext=false eol=false binaryเสียงนั้นใช่ไหม มันอาจจะมีประโยชน์ในการระบุว่า "ฉันรู้ว่าไฟล์เหล่านี้เป็นไฟล์ข้อความ แต่ฉันไม่ต้องการให้พวกมันเป็นมาตรฐาน"
5152

19

ในกลุ่มให้เปิดไฟล์ (เช่น:) :e YOURFILEENTERจากนั้น

:set noendofline binary
:wq

2
เพียงแค่แก้ไขด้วยvimจะทำให้การสิ้นสุดบรรทัดทั้งหมดยังคงอยู่
ตา

ฉันมีปัญหากับไฟล์ Cocoapods บางไฟล์ ข้างต้นคงที่มากที่สุดของพวกเขา; สำหรับส่วนที่เหลือ s / {control-v} {control-m} // ทำกลอุบาย รหัสควบคุมทั้งสองร่วมกันทำให้ ^ M ที่พวกเราใน OS X มักจะเห็นในไฟล์ Windows
janineanne

16

ฉันมีปัญหานี้เช่นกัน

SVN ไม่ได้ทำการแปลงบรรทัดสิ้นสุดดังนั้นไฟล์จะถูกคอมมิชชันด้วยการสิ้นสุดบรรทัด CRLF เหมือนเดิม หากคุณใช้ git-svn เพื่อใส่โครงการเข้าไปใน git แล้ว CRLF endings จะยังคงอยู่ในที่เก็บ git ซึ่งไม่ใช่สถานะ git ที่คาดว่าจะพบตัวเอง - ค่าเริ่มต้นคือมีเพียงปลายสาย unix / linux (LF) ตรวจสอบใน.

เมื่อคุณตรวจสอบไฟล์บน windows การแปลง autocrlf จะทำให้ไฟล์ไม่เสียหาย (เนื่องจากมีจุดสิ้นสุดที่ถูกต้องสำหรับแพลตฟอร์มปัจจุบัน) อย่างไรก็ตามกระบวนการที่ตัดสินใจว่ามีความแตกต่างกับไฟล์ที่เช็คอินหรือไม่นั้นทำการแปลงแบบย้อนกลับก่อนที่จะเปรียบเทียบผลลัพธ์ในการเปรียบเทียบสิ่งที่คิดว่าเป็น LF ในไฟล์ที่เช็กเอาต์ด้วย CRLF ที่ไม่คาดคิดในที่เก็บ

เท่าที่ฉันเห็นตัวเลือกของคุณคือ:

  1. นำเข้ารหัสของคุณอีกครั้งในที่เก็บ git ใหม่โดยไม่ต้องใช้ git-svn นี่จะหมายถึงการสิ้นสุดบรรทัดจะถูกแปลงใน intial git คอมมิท - ทั้งหมด
  2. ตั้งค่า autocrlf เป็น false และไม่สนใจข้อเท็จจริงที่ว่าการสิ้นสุดบรรทัดนั้นไม่ได้อยู่ในรูปแบบที่ต้องการ
  3. ลองตรวจสอบไฟล์ของคุณด้วยการปิด autocrlf แก้ไขการสิ้นสุดบรรทัดทั้งหมดตรวจสอบทุกอย่างกลับมาแล้วเปิดใหม่อีกครั้ง
  4. เขียนประวัติพื้นที่เก็บข้อมูลของคุณเพื่อให้การกระทำดั้งเดิมไม่มี CRLF ที่ไม่ได้คาดหวัง (คำเตือนทั่วไปเกี่ยวกับการเขียนประวัติใหม่นำไปใช้)

เชิงอรรถ:หากคุณเลือกตัวเลือก # 2 ประสบการณ์ของฉันคือเครื่องมือเสริมบางอย่าง (rebase, patch และอื่น ๆ ) ไม่รองรับไฟล์ CRLF และคุณจะจบลงด้วยไฟล์ที่มี CRLF และ LF (เส้นที่ไม่สอดคล้องกัน) ตอนจบ) ฉันรู้ว่าไม่มีทางที่จะทำให้ดีที่สุดทั้งสองอย่าง


2
ฉันคิดว่ามีตัวเลือกที่ 4 ในการเพิ่มลงในรายการของคุณโดยสมมติว่าคุณสามารถเขียนประวัติได้: คุณสามารถใช้ repo git ที่คุณสร้างขึ้นครั้งแรกด้วย git-svn และเขียนประวัติของมันอีกครั้งเพื่อที่จะไม่มี CRLF linefeeds สิ่งนี้จะทำให้ linefeeds ปกติขยายไปถึงประวัติศาสตร์ svn ทั้งหมดของคุณ Keo ผู้ใช้นำเสนอวิธีการแก้ปัญหาหนึ่งที่stackoverflow.com/a/1060828/64257
Chris

เกี่ยวกับเชิงอรรถของคุณ: rebaseไม่มีปัญหากับ CRLF ปัญหาเดียวที่ฉันรู้ก็คือเครื่องมือผสานมาตรฐาน git จะแทรกเครื่องหมายความขัดแย้ง ("<<<<<<", ">>>>>>" ฯลฯ ) ด้วย LF เท่านั้นดังนั้นไฟล์ที่มีเครื่องหมายขัดแย้งจะ มีปลายสายผสม อย่างไรก็ตามเมื่อคุณลบเครื่องหมายแล้วทุกอย่างก็เรียบร้อย
sleske

เป็นไปได้ว่าการจัดการ git นั้นเปลี่ยนไปในช่วง 3 ปีที่ผ่านมานี่เป็นประสบการณ์ตรงของฉันในเวลานั้นฉันไม่จำเป็นต้องทบทวนปัญหานี้อีกเลยตั้งแต่นั้นมา YMMV
ทิม Abell

1
@sleske เริ่มต้นคอมไพล์ 2.8 เครื่องหมายการผสานจะไม่แนะนำการสิ้นสุดของบรรทัดแบบผสมอีกต่อไป ดูstackoverflow.com/a/35474954/6309
VonC

@VonC: เยี่ยมมาก เป็นการดีที่จะรู้สำหรับเวลาที่ฉันต้องทำงานบน Windows
sleske

12

การลบด้านล่างออกจากไฟล์ ~ / .gitattributes

* text=auto

จะป้องกันไม่ให้คอมไพล์ตรวจสอบการสิ้นสุดบรรทัดในครั้งแรก


6
ไม่ถูกต้อง บรรทัดนั้นถ้ามีจะแทนที่การกำหนดค่าของ core.autocrlf หากตั้งค่าเป็น 'จริง' ดังนั้นไม่การลบบรรทัดนั้นจะไม่ป้องกัน git จากการตรวจสอบการสิ้นสุดของบรรทัด
Arafangion

1
อย่างไรก็ตามหาก core.autocrlf ถูกตั้งค่าเป็นfalseถ้าอันนี้ไม่ได้ถูกลบออกการตั้งค่า autocrlf เป็น false จะไม่ช่วยอะไรมากมายดังนั้นอันนี้ก็ช่วยฉันได้ (แต่มันไม่เพียงพอ)
Matty

2
การโหวตนี้ !! ในขณะที่ส่วน "จะป้องกันการคอมไพล์จากการตรวจสอบ" ไม่ถูกต้องทางเทคนิคนี่เป็นคำตอบเดียวที่กล่าวถึงการtext=ตั้งค่าโดยเฉพาะ.gitattributes(ซึ่งหากมีจะเป็นตัวบล็อก) ดังนั้นคำตอบอื่น ๆ จึงไม่สมบูรณ์ ฉันกำลังจะถั่วพยายามคิดออกว่าทำไมไฟล์ของฉันยังคงแสดงเป็น "ปรับเปลี่ยน" ไม่ว่ากี่ครั้งที่ผมเปลี่ยนของฉันautocrlfและsafecrlfการตั้งค่าและการตรวจสอบออกและล้างแคชคอมไพล์และฮาร์ดรีเซ็ต
jdunk

10

คุณควรอ่าน:

คำเตือน: ( ถ้าคุณตรวจสอบ / หรือโคลนไปยังโฟลเดอร์อื่นด้วย core.autocrlf ปัจจุบันของคุณtrue ) LF จะถูกแทนที่ด้วย CRLF

ไฟล์จะมีการสิ้นสุดบรรทัดต้นฉบับในไดเรกทอรีทำงาน( ปัจจุบัน ) ของคุณ

ภาพนี้ควรอธิบายความหมายของมัน ป้อนคำอธิบายรูปภาพที่นี่


นอกจากนี้ยังหมายถึงสิ่งที่ส่งถึงการโค่นล้ม (ถ้าคุณทำ) จะมีการแปลง
jpaugh

10

http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/

echo "* -crlf" > .gitattributes 

ทำสิ่งนี้ในคอมมิทคอมมิตหรือคอมไพล์อาจยังเห็นไฟล์ทั้งหมดตามที่ถูกแก้ไขเมื่อคุณทำการเปลี่ยนแปลงครั้งเดียว (ขึ้นอยู่กับว่าคุณได้เปลี่ยนตัวเลือก autocrlf แล้ว)

อันนี้ใช้งานได้จริง Git จะเคารพการสิ้นสุดของบรรทัดในโปรเจ็กต์การสิ้นสุดบรรทัดแบบผสมและไม่เตือนคุณเกี่ยวกับพวกเขา


2
สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการแปลงระหว่าง CRLF และ LF แต่คุณมีไฟล์. sh บางไฟล์ที่จะต้องไม่เปลี่ยนแปลง ฉันใช้*.sh -crlfตลอดเวลา ...
MartinTeeVarga

9

ฉันไม่ค่อยรู้เรื่อง git บน Windows แต่ ...

ปรากฏว่าฉัน git กำลังแปลงรูปแบบการส่งคืนเพื่อให้ตรงกับแพลตฟอร์มที่ใช้งานอยู่ (Windows) CRLF เป็นรูปแบบผลตอบแทนเริ่มต้นใน Windows ในขณะที่ LF เป็นรูปแบบผลตอบแทนเริ่มต้นสำหรับ OS อื่น ๆ ส่วนใหญ่

โอกาสที่รูปแบบการส่งคืนจะถูกปรับอย่างเหมาะสมเมื่อรหัสถูกย้ายไปยังระบบอื่น ฉันคิดว่าคอมไพล์ฉลาดพอที่จะทำให้ไฟล์ไบนารีไม่เสียหายแทนที่จะพยายามแปลง LF เป็น CRLF ใน JPEG

โดยสรุปคุณอาจไม่ต้องกังวลกับการแปลงนี้มากเกินไป อย่างไรก็ตามถ้าคุณไปที่เก็บโครงการของคุณเป็น tarball เพื่อนโค้ดน่าจะขอบคุณที่มี LF Terminator มากกว่า CRLF ขึ้นอยู่กับว่าคุณสนใจมากแค่ไหน (และขึ้นอยู่กับว่าคุณไม่ได้ใช้ Notepad) คุณอาจต้องการตั้งค่า git ให้ใช้ LF return ถ้าทำได้ :)

ภาคผนวก: CR คือรหัส ASCII 13, LF คือรหัส ASCII 10 ดังนั้น CRLF คือสองไบต์ในขณะที่ LF เป็นหนึ่ง


5
เนื่องจากดูเหมือนว่าไม่มีใครพูดถึงมัน CR ย่อมาจาก "Carriage Return" และ LF ย่อมาจาก "Line Feed" ในฐานะโน้ตที่สองผู้แก้ไข windows หลายคนจะเปลี่ยนไฟล์ข้อความโดยใช้ตัวอักษร LF แทนการขึ้นบรรทัดใหม่เป็นคู่อักขระ CRLF แทน ผู้ใช้งานของเครื่องมือแก้ไขจะไม่ได้รับการเตือน แต่ Git จะเห็นการเปลี่ยนแปลง
2548343

7

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง git ล่าสุดแล้ว
ฉันทำตามข้างต้นgit config core.autocrlf falseเมื่อใช้ git (รุ่น 2.7.1) แต่มันใช้งานไม่ได้
จากนั้นจะทำงานตอนนี้เมื่ออัปเกรดคอมไพล์ (จาก 2.7.1 เป็น 2.20.1)


ฉันคิดว่าคุณหมายถึงคุณมีคอมไพล์ 2.17.1 ฉันมีปัญหาเดียวกันและทำการอัปเดตและสิ่งนี้แก้ไขได้เช่นกัน ดีใจที่ฉันเห็นคำตอบของคุณ!
Phillip McMullen

5
  1. เปิดไฟล์ใน Notepad ++
  2. ไปที่การแก้ไข / การแปลง EOL
  3. คลิกที่รูปแบบ Windows
  4. บันทึกไฟล์

1
ลองใช้git config --global core.autocrlf falseเพื่อป้องกัน Git จากการตั้งค่าการสิ้นสุดบรรทัดไปUnixที่การคอมมิท ติดตามgit config core.autocrlfเพื่อตรวจสอบว่ามีการตั้งค่าเป็นเท็จอย่างแน่นอน
Contango

5

คำถามของ OP เกี่ยวข้องกับ windows และฉันไม่สามารถใช้งานอื่น ๆ ได้โดยไม่ต้องไปที่ไดเรกทอรีหรือแม้แต่เรียกใช้ไฟล์ใน Notepad ++ เนื่องจากผู้ดูแลระบบไม่ทำงาน .. ดังนั้นต้องไปที่เส้นทางนี้:

C:\Program Files (x86)\Git\etc>git config --global core.autocrlf false

3

เครื่องมือแก้ไขข้อความจำนวนมากอนุญาตให้คุณเปลี่ยนได้LFดูคำแนะนำ Atom ด้านล่าง ง่ายและชัดเจน


คลิกCRLFที่ด้านล่างขวา:

ป้อนคำอธิบายรูปภาพที่นี่

เลือกLFแบบเลื่อนลงด้านบน:

ป้อนคำอธิบายรูปภาพที่นี่


2

ในพรอมต์ GNU / Linux เชลล์คำสั่ง dos2unix & unix2dos ช่วยให้คุณสามารถแปลง / จัดรูปแบบไฟล์ที่มาจาก MS Windows ได้อย่างง่ายดาย


2

CRLF อาจทำให้เกิดปัญหาขณะใช้ "รหัส" ของคุณในสองระบบปฏิบัติการที่แตกต่างกัน (Linux และ Windows) สคริปต์ python ของฉันถูกเขียนในคอนเทนเนอร์ dock dock ของ Linux จากนั้นดันโดยใช้ Windows git-bash มันเตือนฉันว่า LF จะถูกแทนที่ด้วย CRLF ผมไม่ได้ให้มันมีความคิด /usr/bin/env: 'python\r': No such file or directoryแต่แล้วเมื่อผมเริ่มสคริปต์ต่อมาก็กล่าวว่า ตอนนี้\rสำหรับ ramification สำหรับคุณ Windows ใช้ "CR" - กลับรถ - ด้านบนของ '\ n' เป็นตัวอักษรบรรทัดใหม่ \n\r- นั่นคือสิ่งที่คุณอาจต้องพิจารณา


0

เครื่องมือส่วนใหญ่ใน Windows ยอมรับเฉพาะ LF ในไฟล์ข้อความ ตัวอย่างเช่นคุณสามารถควบคุมพฤติกรรมของ Visual Studio ในไฟล์ชื่อ '. editorconfig' ด้วยเนื้อหาตัวอย่าง (ส่วนหนึ่ง) ดังต่อไปนี้:

 indent_style = space
 indent_size = 2
 end_of_line = lf    <<====
 charset = utf-8

เฉพาะ Windows-Notepad ดั้งเดิมเท่านั้นที่ใช้ไม่ได้กับ LF แต่มีเครื่องมือแก้ไขอย่างง่าย ๆ ที่เหมาะสมกว่านี้!

ดังนั้นคุณควรใช้ LF ในไฟล์ข้อความใน Windows ด้วย นี่คือข้อความของฉันแนะนำ! ไม่มีเหตุผลที่จะใช้ CRLF ใน windows!

(การสนทนาเดียวกันนั้นใช้ \ in include path ใน C / ++ มันเป็นเรื่องโกหกใช้ #include <pathTo / myheader.h> ด้วยเครื่องหมายทับ! ซึ่งเป็นมาตรฐาน C / ++ และคอมไพเลอร์ของ Microsoft ทั้งหมดสนับสนุน)

ดังนั้นการตั้งค่าที่เหมาะสมสำหรับคอมไพล์คือ

git config core.autocrlf false

ข้อความของฉัน: ลืมโปรแกรมการคิดแบบเดิม ๆ เช่น dos2unix และ unix2dos ชี้แจงในทีมของคุณว่า LF เหมาะสมที่จะใช้ใน Windows

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