การแปลงบรรทัดสิ้นสุดทำงานกับ git core.autocrlf ระหว่างระบบปฏิบัติการที่แตกต่างกันอย่างไร


220

ฉันได้อ่านคำถามและคำตอบที่แตกต่างกันมากมายใน Stack Overflow รวมถึงเอกสารgitว่าการตั้งค่าcore.autocrlfทำงานอย่างไร

นี่คือความเข้าใจของฉันจากสิ่งที่ฉันได้อ่าน:

Unix และ Mac OSX (pre-OSX ใช้ CR) ไคลเอ็นต์ใช้ปลายสาย LF
ไคลเอนต์ Windows ใช้การสิ้นสุดบรรทัด CRLF

เมื่อ core.autocrlf ถูกตั้งค่าเป็นจริงบนไคลเอนต์ที่เก็บ git มักจะเก็บไฟล์ในรูปแบบสิ้นสุดบรรทัด LF และสิ้นสุดบรรทัดในไฟล์บนไคลเอนต์จะถูกแปลงไปมาเมื่อตรวจสอบ / กระทำสำหรับลูกค้า (เช่น Windows) ที่ใช้ไม่ใช่ -LF การจบบรรทัดไม่ว่ารูปแบบไฟล์ไฟล์การจบบรรทัดจะอยู่บนไคลเอนต์ (ไม่เห็นด้วยกับคำจำกัดความของ Tim Clem - ดูการอัปเดตด้านล่าง)

นี่คือเมทริกซ์ที่พยายามจัดทำเอกสารเดียวกันสำหรับการตั้งค่า 'อินพุต' และ 'เท็จ' ของ core.autocrlf พร้อมเครื่องหมายคำถามซึ่งฉันไม่แน่ใจว่าพฤติกรรมการแปลงบรรทัดสิ้นสุดแล้ว

คำถามของฉันคือ:

  1. เครื่องหมายคำถามควรเป็นอย่างไร
  2. เมทริกซ์นี้ถูกต้องสำหรับ "เครื่องหมายที่ไม่ใช่คำถาม" หรือไม่?

ฉันจะอัปเดตเครื่องหมายคำถามจากคำตอบเนื่องจากดูเหมือนว่าจะเกิดขึ้น

                       ค่า core.autocrlf
            true อินพุต false
-------------------------------------------------- --------
กระทำ แปลงหรือไม่ ?
ใหม่ | ถึง LF (แปลงเป็น LF?) (ไม่มีการแปลง?)

กระทำ เปลี่ยนเป็น ? ไม่
ที่มีอยู่ | การแปลง LF (แปลงเป็น LF?)

ชำระเงิน เปลี่ยนเป็น ? ไม่
ที่มีอยู่ | CRLF (ไม่มีการแปลงหรือไม่) การแปลง

ฉันไม่ได้มองหาความคิดเห็นเกี่ยวกับข้อดีข้อเสียของการตั้งค่าต่างๆ ฉันแค่มองหาข้อมูลที่ทำให้ชัดเจนว่าจะคาดหวังได้อย่างไรว่าคอมไพล์จะทำงานกับการตั้งค่าทั้งสาม

-

อัปเดต 04/17/2012 : หลังจากอ่านบทความโดย Tim Clem ที่ลิงก์โดย JJD ในความคิดเห็นฉันได้แก้ไขค่าบางอย่างในค่า "ไม่ทราบ" ในตารางด้านบนรวมถึงการเปลี่ยน "เช็คเอาต์ที่มีอยู่ | จริงเพื่อแปลง เป็น CRLF แทนที่จะเปลี่ยนเป็นลูกค้า " นี่คือคำจำกัดความที่เขาให้ซึ่งชัดเจนกว่าสิ่งที่ฉันเคยเห็นที่อื่น:

core.autocrlf = false

นี่เป็นค่าเริ่มต้น แต่คนส่วนใหญ่ควรเปลี่ยนทันที ผลลัพธ์ของการใช้ false คือ Git ไม่เคยยุ่งกับการสิ้นสุดบรรทัดในไฟล์ของคุณ คุณสามารถเช็คอินไฟล์ด้วย LF หรือ CRLF หรือ CR หรือการผสมผสานแบบสุ่มของทั้งสามและ Git ไม่สนใจ สิ่งนี้อาจทำให้ยากต่อการอ่านและการรวมที่ยากขึ้น คนส่วนใหญ่ที่ทำงานในโลก Unix / Linux ใช้ค่านี้เพราะพวกเขาไม่มีปัญหา CRLF และพวกเขาไม่ต้องการให้ Git ทำงานพิเศษเมื่อไฟล์ถูกเขียนไปยังฐานข้อมูลวัตถุหรือเขียนลงในไดเรกทอรีการทำงาน

core.autocrlf = จริง

ซึ่งหมายความว่า Git จะประมวลผลไฟล์ข้อความทั้งหมดและตรวจสอบให้แน่ใจว่า CRLF ถูกแทนที่ด้วย LF เมื่อเขียนไฟล์นั้นไปยังฐานข้อมูลวัตถุและเปลี่ยน LF ทั้งหมดกลับเป็น CRLF เมื่อเขียนลงในไดเรกทอรีการทำงาน นี่เป็นการตั้งค่าที่แนะนำบน Windows เพราะจะช่วยให้แน่ใจว่าที่เก็บของคุณสามารถใช้บนแพลตฟอร์มอื่น ๆ ได้ในขณะที่ยังคง CRLF ไว้ในไดเรกทอรีทำงานของคุณ

core.autocrlf = อินพุต

ซึ่งหมายความว่า Git จะประมวลผลไฟล์ข้อความทั้งหมดและตรวจสอบให้แน่ใจว่า CRLF ถูกแทนที่ด้วย LF เมื่อเขียนไฟล์นั้นไปยังฐานข้อมูลวัตถุ อย่างไรก็ตามจะไม่ทำสิ่งที่ตรงกันข้าม เมื่อคุณอ่านไฟล์กลับจากฐานข้อมูลวัตถุและเขียนลงในไดเรกทอรีการทำงานพวกเขาจะยังมี LF เพื่อแสดงจุดสิ้นสุดของบรรทัด โดยทั่วไปการตั้งค่านี้จะใช้กับ Unix / Linux / OS X เพื่อป้องกัน CRLF จากการเขียนลงในที่เก็บ แนวคิดที่ว่าถ้าคุณวางโค้ดจากเว็บเบราว์เซอร์และนำ CRLFs ไปไว้ในไฟล์ใดไฟล์หนึ่งของคุณโดยไม่ตั้งใจ Git จะตรวจสอบให้แน่ใจว่ามันถูกแทนที่ด้วย LFs เมื่อคุณเขียนไปยังฐานข้อมูลวัตถุ

บทความของ Tim นั้นยอดเยี่ยมสิ่งเดียวที่ฉันคิดได้ว่าหายไปคือเขาถือว่าที่เก็บอยู่ในรูปแบบ LF ซึ่งไม่จำเป็นต้องเป็นจริงโดยเฉพาะกับโครงการ Windows เท่านั้น

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


7
การรักษาความautocrlfผิดดูเหมือนง่ายกว่ามาก;) stackoverflow.com/questions/2333424/…
VonC

@VonC: ฉันได้อ่านแล้วและฉันคิดว่าฉันเข้าใจ แต่ฉันไม่จำเป็นต้องเลือก ฉันทำงานกับที่เก็บ git ที่ฉันไม่ได้ควบคุมว่าใครต้องการให้ฉันตั้งค่าในทางใดทางหนึ่ง
Michael Maddox

5
มันจะไม่ดีถ้า Windows ปรับมาตรฐานให้เป็น LF เช่นกัน? Mac เคยเป็น CR (v10 ก่อนหน้า) แต่ตอนนี้ได้รับการปรับสู่ LF
Brett Ryan

3
ฉันจำเป็นต้องเพิ่มลิงค์ไปยังบทความที่ดีของทิโมธีเคล็ม - โปรดอ่านทั้งหมดของใจในตอนท้ายของสายของคุณ
JJD

1
สถานการณ์จำลอง: ฉันเป็นนักพัฒนา Linux / Windows แบบแยกส่วน ฉันใช้เท็กซ์เอดิเตอร์ที่สามารถจดจำการสิ้นสุดบรรทัดทั้งสองประเภท (IE. vim, eclipse) ฉันต้องการ (ต้องการ) เพื่อทำงานกับไฟล์ที่ลงท้ายด้วย LF ฉันมี core.autocrlf = ชุดอินพุตในการตั้งค่า git ทั่วโลกของฉัน ฉันสบายดีไหม ฉันจะมีความขัดแย้งหรือไม่?
Chris

คำตอบ:


128

คำอธิบายที่ดีที่สุดเกี่ยวกับวิธีการcore.autocrlfทำงานบนหน้า man gitattributesในtextส่วนของคุณสมบัติ

นี่คือวิธีcore.autocrlfการทำงานในปัจจุบัน (หรืออย่างน้อยก็ตั้งแต่ v1.7.2 จากสิ่งที่ฉันทราบ):

  • core.autocrlf = true
    1. ไฟล์ข้อความเช็กเอาต์จากที่เก็บที่มีเฉพาะLFอักขระเท่านั้นที่ถูกทำให้เป็นมาตรฐานCRLFในแผนผังการทำงานของคุณ ไฟล์ที่มีCRLFในที่เก็บจะไม่ถูกสัมผัส
    2. ไฟล์ข้อความที่มีเฉพาะLFอักขระในที่เก็บจะถูกทำให้เป็นมาตรฐานจากCRLFถึงLFเมื่อส่งกลับไปยังที่เก็บ ไฟล์ที่มีCRLFอยู่ในที่เก็บจะไม่ถูกแตะต้อง
  • core.autocrlf = input
    1. ไฟล์ข้อความที่เช็กเอาต์จากที่เก็บจะเก็บอักขระ EOL ดั้งเดิมไว้ในแผนผังการทำงานของคุณ
    2. ไฟล์ข้อความในแผนผังการทำงานของคุณพร้อมCRLFตัวอักษรจะถูกทำให้เป็นมาตรฐานLFเมื่อส่งกลับไปยังที่เก็บ
  • core.autocrlf = false
    1. core.eol กำหนดอักขระ EOL ในไฟล์ข้อความของแผนผังการทำงานของคุณ
    2. core.eol = nativeโดยค่าเริ่มต้นซึ่งหมายความว่า Windows EOL เป็นCRLFและ * nix EOLs อยู่LFในแผนผังการทำงาน
    3. gitattributesการตั้งค่าพื้นที่เก็บข้อมูลจะกำหนดการทำให้เป็นมาตรฐานของอักขระ EOL สำหรับการคอมมิทไปยังที่เก็บ (ค่าดีฟอลต์คือการทำให้เป็นมาตรฐานเป็นLFอักขระ)

ฉันเพิ่งค้นคว้าปัญหานี้เมื่อไม่นานมานี้และฉันก็พบว่าสถานการณ์จะซับซ้อนมาก การcore.eolตั้งค่านี้ช่วยอธิบายได้อย่างชัดเจนว่าอักขระ EOL ได้รับการจัดการอย่างไรโดย git


3
สำหรับ autocrlf = true ไม่ควรเป็นดังนี้? ไฟล์ข้อความที่มีเฉพาะอักขระ CRLF EOL ในที่เก็บจะถูกทำให้เป็นมาตรฐานจาก CRLF ถึง LF เมื่อส่งกลับไปยังที่เก็บ ไฟล์ที่มี LF ในที่เก็บจะไม่ถูกแตะต้อง
Piotr Lewandowski

2
สำหรับฉันแม้ว่า autocrlf = false git กำลังแปลง EOL เป็น CRLF หลังจากอ่านคำตอบนี้ฉันรู้ว่าไฟล์. gitattribute ของฉันมี text = auto set ซึ่งเป็นสาเหตุของปัญหา
irsis

1
สำหรับcore.autocrlf = falseถ้าฉันไม่มีgitattributesไฟล์หมายความว่าจะไม่มีการทำให้เป็นมาตรฐาน? หรือหมายความว่าจะใช้การปรับสภาพเริ่มต้น?
Chin

.gitattributesไฟล์ไม่ควรมีความสำคัญมากกว่าcore.autocrlfการตั้งค่า?
Qwerty

63

ปัญหาของ EOL ในโปรเจคแบบผสมทำให้ชีวิตฉันอนาถเป็นเวลานาน ปัญหามักจะเกิดขึ้นเมื่อมีไฟล์ที่มี EOL ต่างกันและผสมอยู่แล้วใน repo ซึ่งหมายความว่า:

  1. repo อาจมีไฟล์ต่างกันที่มี EOL ต่างกัน
  2. ไฟล์บางไฟล์ใน repo อาจมี EOL แบบผสมเช่นการรวมกันCRLFและLFในไฟล์เดียวกัน

สิ่งนี้เกิดขึ้นได้อย่างไรไม่ใช่ปัญหาที่นี่ แต่เกิดขึ้นได้

ฉันรันการทดสอบการแปลงบางอย่างบน Windows สำหรับโหมดต่างๆและชุดค่าผสมของพวกเขา
นี่คือสิ่งที่ฉันได้รับในตารางที่ปรับเปลี่ยนเล็กน้อย:

                 | ส่งผลให้เกิดการแปลงเมื่อ | ส่งผลให้เกิดการแปลงเมื่อ
                 | กระทำไฟล์ต่าง ๆ | ตรวจสอบจาก repo -
                 | EOL เข้าไปใน repo และ | กับไฟล์ผสมในนั้นและ
                 | ค่า core.autocrlf: | ค่า core.autocrlf:           
-------------------------------------------------- ------------------------------
ไฟล์ | จริง | อินพุต | เท็จ | จริง | อินพุต | เท็จ
-------------------------------------------------- ------------------------------
Windows-CRLF | CRLF -> LF | CRLF -> LF | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | อย่างที่เป็น
Unix -LF | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | LF -> CRLF | ตามที่เป็น | อย่างที่เป็น
Mac -CR | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | อย่างที่เป็น
Mixed-CRLF + LF | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | อย่างที่เป็น
Mixed-CRLF + LF + CR | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | ตามที่เป็น | อย่างที่เป็น

อย่างที่คุณเห็นมี 2 กรณีเมื่อเกิดการแปลงเมื่อกระทำ (คอลัมน์ซ้าย 3 คอลัมน์) ในกรณีที่เหลือไฟล์จะถูกกำหนดตามที่เป็น

เมื่อชำระเงิน (3 คอลัมน์ที่ถูกต้อง) จะมีเพียง 1 กรณีเท่านั้นที่การแปลงเกิดขึ้นเมื่อ:

  1. core.autocrlfเป็นtrue และ
  2. ไฟล์ใน repo มีLFEOL

น่าแปลกใจที่สุดสำหรับฉันและฉันสงสัยว่าสาเหตุของปัญหา EOL มากมายคือไม่มีการกำหนดค่าใดที่ EOL แบบผสมเช่นCRLF+ LFได้รับการทำให้เป็นมาตรฐาน

โปรดทราบว่า Mac EOL รุ่นเก่าCRเท่านั้นที่ไม่เคยถูกแปลง
ซึ่งหมายความว่าถ้าสคริปต์ EOL แปลงเขียนไม่ดีพยายามที่จะแปลงไฟล์ที่ลงท้ายผสมกับCRLFs + LFs โดยเพียงแค่การแปลงLFเพื่อCRLFs แล้วมันจะออกจากไฟล์ในโหมดผสมกับ "เหงา" CRs ใดก็ตามที่ถูกดัดแปลงCRLF Git จะไม่แปลงอะไรแม้แต่ในโหมดและ EOL ความเสียหายดำเนินต่อไป สิ่งนี้เกิดขึ้นกับฉันและทำให้ไฟล์ของฉันแย่มากเนื่องจากบรรณาธิการและคอมไพเลอร์ (เช่น VS2010) ไม่ชอบ Mac EOLsCRCRLF
true

ฉันเดาวิธีเดียวที่จะจัดการกับปัญหาเหล่านี้ได้อย่างแท้จริงคือการทำให้ปกติ repo ทั้งหมดเป็นครั้งคราวโดยการตรวจสอบไฟล์ทั้งหมดในinputหรือfalseโหมดเรียกใช้การปรับสภาพให้เหมาะสมและเรียกคืนไฟล์ที่ถูกเปลี่ยนใหม่ (ถ้ามี) บน Windows อาจทำงานต่อcore.autocrlf trueได้


4
คำตอบที่ดีเลิศ แต่หนึ่งประโยคที่ฉันไม่เห็นด้วยคือบน Windows สันนิษฐานว่าจะทำงานต่อcore.autocrlf trueได้ โดยส่วนตัวผมเชื่อว่าinputควรจะใช้เสมอ
G. Demecki

39

สิ่งที่กำลังจะเปลี่ยนแปลงในหน้า "การแปลง eol" ด้วยGit ที่กำลังจะมา 1.7.2 :

การตั้งค่า config ใหม่core.eolจะถูกเพิ่ม / พัฒนา :

นี่เป็นการแทนที่สำหรับ 'เพิ่ม " core.eol" ตัวแปรการกำหนดค่า' การกระทำที่อยู่ในขณะนี้pu(อันสุดท้ายในชุดของฉัน)
แทนที่จะหมายความว่า " core.autocrlf=true" จะเปลี่ยนสำหรับ " * text=auto" มันทำให้ชัดเจนความจริงที่ว่าautocrlfเป็นเพียงสำหรับผู้ใช้ที่ต้องการทำงานร่วมกับ CRLFs ในไดเรกทอรีการทำงานของพวกเขาในพื้นที่เก็บข้อมูลที่ไม่ได้มีไฟล์ข้อความฟื้นฟู
เมื่อเปิดใช้งานระบบจะละเว้น "core.eol"

แนะนำตัวแปรการกำหนดค่าใหม่ " core.eol" ที่ช่วยให้ผู้ใช้สามารถตั้งค่าการสิ้นสุดบรรทัดที่จะใช้สำหรับไฟล์ที่สิ้นสุดบรรทัดบรรทัดปกติในไดเรกทอรีการทำงาน
มันเริ่มต้นที่ " native" ซึ่งหมายถึง CRLF ใน Windows และ LF ทุกที่อื่น โปรดทราบว่า " core.autocrlf" core.eolแทนที่
ซึ่งหมายความว่า:

[core]
  autocrlf = true

วาง CRLF ในไดเรกทอรีทำงานแม้ว่าcore.eolจะตั้งเป็น " lf"

core.eol:

ตั้งค่าชนิดสิ้นสุดบรรทัดเพื่อใช้ในไดเร็กทอรีการทำงานสำหรับไฟล์ที่มีtextชุดคุณสมบัติ
ทางเลือกคือ 'lf', 'crlf' และ 'native' ซึ่งใช้การสิ้นสุดบรรทัดดั้งเดิมของแพลตฟอร์ม ค่าเริ่มต้นคือ
native


วิวัฒนาการอื่น ๆกำลังได้รับการพิจารณา :

สำหรับ 1.8 ฉันจะพิจารณาที่จะcore.autocrlfเปิดใช้งานการทำให้เป็นมาตรฐานและปล่อยให้ไดเรกทอรีการทำงานสิ้นสุดการตัดสินใจไปที่ core.eol แต่นั่นจะทำให้การตั้งค่าของผู้คนแตกหัก


git 2.8 (มีนาคม 2016) ปรับปรุงวิธีที่core.autocrlfมีอิทธิพลต่อ eol:

ดูกระทำ 817a0c7 (23 กุมภาพันธ์ 2016) กระทำ 6e336a5 , กระทำ df747b8 , กระทำ df747b8 (10 กุมภาพันธ์ 2016) กระทำ df747b8 , กระทำ df747b8 (10 กุมภาพันธ์ 2016) และกระทำ 4b4024f , กระทำ bb211b4 , กระทำ 92cce13 , กระทำ 320d39c , กระทำ 4b4024f , กระทำ bb211b4 , กระทำ 92cce13 , กระทำ 320d39c (5 กุมภาพันธ์ 2016) โดยTorsten Bögershausen (tboegi )
ผสานโดยJunio ​​C Hamano - gitster- in c6b94eb, 26 ก.พ. 2559)

convert.c: ปรับปรุงโครงสร้าง crlf_action

Refactor crlf_actionความมุ่งมั่นและการใช้งานของ
วันนี้เมื่อไม่มี " crlfแอตทริบิวต์" ตั้งอยู่บนไฟล์มีการตั้งค่าcrlf_action CRLF_GUESSใช้CRLF_UNDEFINEDแทนและค้นหา " text" หรือ " eol" เหมือนเดิม

แทนที่การCRLF_GUESSใช้งานเดิม:

CRLF_GUESS && core.autocrlf=true -> CRLF_AUTO_CRLF
CRLF_GUESS && core.autocrlf=false -> CRLF_BINARY
CRLF_GUESS && core.autocrlf=input -> CRLF_AUTO_INPUT

ทำให้ชัดเจนยิ่งขึ้นว่าอะไรคือสิ่งที่กำหนดโดย:

- CRLF_UNDEFINED : No attributes set. Temparally used, until core.autocrlf
                   and core.eol is evaluated and one of CRLF_BINARY,
                   CRLF_AUTO_INPUT or CRLF_AUTO_CRLF is selected
- CRLF_BINARY    : No processing of line endings.
- CRLF_TEXT      : attribute "text" is set, line endings are processed.
- CRLF_TEXT_INPUT: attribute "input" or "eol=lf" is set. This implies text.
- CRLF_TEXT_CRLF : attribute "eol=crlf" is set. This implies text.
- CRLF_AUTO      : attribute "auto" is set.
- CRLF_AUTO_INPUT: core.autocrlf=input (no attributes)
- CRLF_AUTO_CRLF : core.autocrlf=true  (no attributes)

ในฐานะที่เป็นtorekเพิ่มในความคิดเห็น :

การแปลทั้งหมดเหล่านี้ (การแปลง EOL ใด ๆ จากeol=หรือautocrlfการตั้งค่าและcleanตัวกรอง "") จะทำงานเมื่อไฟล์ย้ายจากแผนผังต้นไม้ไปยังดัชนีเช่นระหว่างgit addมากกว่าgit commitเวลา
(หมายเหตุว่าgit commit -aหรือ--onlyหรือ--includeทำไฟล์เพิ่มเพื่อจัดทำดัชนีในเวลานั้น แต่.)

สำหรับข้อมูลเพิ่มเติมโปรดดูที่ " ความแตกต่างระหว่าง autocrlf และ eol คืออะไร "


18
น่าเสียดายที่นี่ไม่ได้เพิ่มความชัดเจนให้ฉัน ดูเหมือนว่าพวกเขากำลังพูดว่ามีปัญหากับการใช้งานในปัจจุบัน (ไม่ชัดเจนว่าปัญหาเหล่านั้นคืออะไร) และพวกเขากำลังเพิ่มความซับซ้อนในความพยายามที่จะแก้ไขปัญหาที่ไม่ได้ระบุ ในความคิดของฉันการตั้งค่า core.autocrlf นั้นซับซ้อนเกินไปและมีเอกสารไม่เพียงพอและสถานการณ์นั้นดูเหมือนจะแย่ลง ขอบคุณอีกครั้งสำหรับหัวขึ้น
Michael Maddox

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

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

@donquixote อีกครั้งฉันเห็นด้วย แต่core.eolเกี่ยวกับ "การแก้ไขโดยอัตโนมัติ" เฉพาะสิ่งที่คุณประกาศไว้อย่างชัดเจนใน.gitattributesไฟล์ ซึ่งแตกต่างจากcore.autocrlfที่ใช้กับไฟล์ใด ๆใน repo มันเป็นกระบวนการที่เปิดเผย
VonC

1
@donquixote: ฉันรู้ว่ามันค่อนข้างเก่า แต่ฉันเพิ่งอ่านความคิดเห็นของคุณตอนนี้ ในความเป็นจริงการแปลทั้งหมดเหล่านี้ (การแปลง EOL ใด ๆ จากการตั้งค่า eol = หรือ autocrlf และตัวกรอง "สะอาด") จะทำงานเมื่อไฟล์ย้ายจากแผนผังต้นไม้ไปยังดัชนีเช่นระหว่างgit addมากกว่าgit commitเวลา (หมายเหตุว่าgit commit -aหรือ--onlyหรือ--includeทำไฟล์เพิ่มเพื่อจัดทำดัชนีในเวลานั้น แต่.) สำหรับสิ่งที่คุ้มค่า, คุณและฉันและ Linus Torvalds ทุกคนเกลียดความคิดของ VCS เคยปรับเปลี่ยนสิ่งที่เป็นความมุ่งมั่น แต่มีผู้ใช้ Windows ทั้งหมด ... :-)
torek

34

core.autocrlfค่าไม่ได้ขึ้นอยู่กับชนิด OS แต่ค่าเริ่มต้นของ Windows trueและ Linux input- ฉันสำรวจ 3 ค่าที่เป็นไปได้สำหรับกรณีการส่งและการชำระเงินและนี่คือตารางผลลัพธ์:

╔═══════════════╦══════════════╦══════════════╦══════════════╗
║ core.autocrlf ║     false    ║     input    ║     true     ║
╠═══════════════╬══════════════╬══════════════╬══════════════╣
║               ║ LF   => LF   ║ LF   => LF   ║ LF   => LF   ║
║ git commit    ║ CR   => CR   ║ CR   => CR   ║ CR   => CR   ║
║               ║ CRLF => CRLF ║ CRLF => LF   ║ CRLF => LF   ║
╠═══════════════╬══════════════╬══════════════╬══════════════╣
║               ║ LF   => LF   ║ LF   => LF   ║ LF   => CRLF ║
║ git checkout  ║ CR   => CR   ║ CR   => CR   ║ CR   => CR   ║
║               ║ CRLF => CRLF ║ CRLF => CRLF ║ CRLF => CRLF ║
╚═══════════════╩══════════════╩══════════════╩══════════════╝

5
สรุปคำศัพท์สั้น ๆ : ไฟล์ที่มีCRคนเดียวไม่เคยสัมผัส falseอย่าแตะต้องปลายแถว trueกระทำการLFและเช็คเอาต์เป็นCRLFเสมอ และinputกระทำการLFและตรวจสอบตามที่เป็นอยู่เสมอ
Furkan Kambay

7

นี่คือความเข้าใจของฉันจนถึงตอนนี้ในกรณีที่มันช่วยใครบางคน

core.autocrlf=true และ core.safecrlf = true

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

core.autocrlf=false

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

core.autocrlf=input

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


3

ไม่คำตอบ @jmlane ผิด

สำหรับCheckin (git add, git commit):

  1. ถ้าtextคุณสมบัติคือSet, Set value to 'auto'การแปลงเกิดขึ้น enen ไฟล์ที่ได้รับมอบหมายด้วย 'CRLF'
  2. ถ้าtextคุณสมบัติคือUnset: ไม่มีอะไรเกิดขึ้นCheckout
  3. ถ้าtextคุณสมบัติคือUnspecifiedการแปลงขึ้นอยู่กับcore.autocrlf
    1. หากautocrlf = input or autocrlf = trueการแปลงเกิดขึ้นเมื่อไฟล์ในที่เก็บคือ 'LF' หากเป็น 'CRLF' จะไม่มีอะไรเกิดขึ้น
    2. ถ้าautocrlf = falseไม่มีอะไรเกิดขึ้น

สำหรับCheckout:

  1. ถ้าtextคุณสมบัติคือUnset: ไม่มีอะไรเกิดขึ้น
  2. ถ้าtextทรัพย์สินSet, Set value to 'auto: มันขึ้นอยู่กับ, core.autocrlfcore.eol
    1. core.autocrlf = input: ไม่มีอะไรเกิดขึ้น
    2. core.autocrlf = true: การแปลงจะเกิดขึ้นก็ต่อเมื่อไฟล์ในพื้นที่เก็บข้อมูลคือ 'LF', 'LF' -> 'CRLF'
    3. core.autocrlf = false: การแปลงจะเกิดขึ้นก็ต่อเมื่อไฟล์ในพื้นที่เก็บข้อมูลคือ 'LF', 'LF' -> core.eol
  3. ถ้าtextคุณสมบัติคือมันขึ้นอยู่กับ Unspecifiedcore.autocrlf
    1. เหมือนกับ 2.1
    2. เหมือนกับ 2.2
    3. ไม่มีไม่มีอะไรเกิดขึ้น core.eol ไม่มีประสิทธิภาพเมื่อtextคุณสมบัติเป็นUnspecified

พฤติกรรมเริ่มต้น

ดังนั้นพฤติกรรมเริ่มต้นคือtextคุณสมบัติคือUnspecifiedและcore.autocrlf = false:

  1. สำหรับการเช็คอินไม่มีอะไรเกิดขึ้น
  2. สำหรับการชำระเงินไม่มีอะไรเกิดขึ้น

สรุปผลการวิจัย

  1. ถ้าtextตั้งค่าคุณสมบัติพฤติกรรมการเช็คอินจะขึ้นอยู่กับตัวเองไม่ใช่ใน autocrlf
  2. autocrlf หรือ core.eol สำหรับการตรวจสอบพฤติกรรมและ autocrlf> core.eol

2

ทำการทดสอบบางอย่างทั้งบน linux และ windows ฉันใช้ไฟล์ทดสอบที่มีบรรทัดที่ลงท้ายด้วย LF และบรรทัดที่ลงท้ายด้วย CRLF
ไฟล์ถูกคอมมิตลบออกจากนั้นเช็กเอาต์ ค่าของ core.autocrlf ถูกตั้งค่าก่อนที่จะกระทำและก่อนที่จะเช็คเอาท์ ผลลัพธ์อยู่ด้านล่าง

commit core.autocrlf false, remove, checkout core.autocrlf false: LF=>LF   CRLF=>CRLF  
commit core.autocrlf false, remove, checkout core.autocrlf input: LF=>LF   CRLF=>CRLF  
commit core.autocrlf false, remove, checkout core.autocrlf true : LF=>LF   CRLF=>CRLF  
commit core.autocrlf input, remove, checkout core.autocrlf false: LF=>LF   CRLF=>LF  
commit core.autocrlf input, remove, checkout core.autocrlf input: LF=>LF   CRLF=>LF  
commit core.autocrlf input, remove, checkout core.autocrlf true : LF=>CRLF CRLF=>CRLF  
commit core.autocrlf true, remove, checkout core.autocrlf false: LF=>LF   CRLF=>LF  
commit core.autocrlf true, remove, checkout core.autocrlf input: LF=>LF   CRLF=>LF  
commit core.autocrlf true,  remove, checkout core.autocrlf true : LF=>CRLF CRLF=>CRLF  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.