อะไรคือจุดประสงค์ของ "text = auto" ในไฟล์ ".gitattributes`


คำตอบ:


78

จากเอกสาร :

แต่ละบรรทัดใน.gitattributes(หรือ.git/info/attributes) ไฟล์มีรูปแบบ:

pattern attr1 attr2 ...

ดังนั้นที่นี่แบบแผนคือซึ่งหมายความว่าทุกไฟล์และแอตทริบิวต์*text=auto

อะไรtext=autoทำอย่างไร จากเอกสารประกอบ:

เมื่อข้อความถูกตั้งค่าเป็น "อัตโนมัติ" เส้นทางจะถูกทำเครื่องหมายสำหรับการทำให้เป็นมาตรฐานอัตโนมัติในตอนท้ายของบรรทัด หาก Git ตัดสินใจว่าเนื้อหาเป็นข้อความการลงท้ายบรรทัดจะถูกปรับให้เป็น LF เมื่อทำการเช็คอิน

พฤติกรรมเริ่มต้นคืออะไรหากไม่ได้เปิดใช้งาน?

ยังไม่ระบุ

หากไม่ระบุแอตทริบิวต์ข้อความ Git จะใช้ตัวแปรคอนฟิกูเรชัน core.autocrlf เพื่อพิจารณาว่าควรแปลงไฟล์หรือไม่

อะไรcore.autocrlfทำอย่างไร จากเอกสาร:

   core.autocrlf

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

ถ้าคุณคิดว่าทั้งหมดนี้ชัดเจนเหมือนโคลนคุณไม่ได้อยู่คนเดียว

นี่คือสิ่งที่* text=autoพูดในคำพูดของฉัน:เมื่อมีคนส่งไฟล์ Git จะเดาว่าไฟล์นั้นเป็นไฟล์ข้อความหรือไม่และถ้าเป็นเช่นนั้นไฟล์จะส่งไฟล์เวอร์ชันที่ไบต์ CR + LF ทั้งหมดถูกแทนที่ด้วยไบต์ LF ไม่มีผลโดยตรงกับไฟล์ที่มีลักษณะเป็นโครงสร้างการทำงานมีการตั้งค่าอื่น ๆ ที่จะแปลง LF ไบต์เป็น CR + LF ไบต์เมื่อตรวจสอบไฟล์

คำแนะนำ:

ฉันจะไม่แนะนำให้ใส่* text=autoใน.gitattributesไฟล์ ฉันขอแนะนำสิ่งนี้แทน:

*.txt text
*.html text
*.css text
*.js text

สิ่งนี้กำหนดอย่างชัดเจนว่าไฟล์ใดเป็นไฟล์ข้อความซึ่งได้รับ CRLF แปลงเป็น LF ในฐานข้อมูลอ็อบเจ็กต์ (แต่ไม่จำเป็นต้องอยู่ในโครงสร้างการทำงาน) เรามี repo ด้วย* text=autoและ Git เดาผิดสำหรับไฟล์รูปภาพว่าเป็นไฟล์ข้อความทำให้ไฟล์เสียหายเนื่องจากแทนที่ CR + LF ไบต์ด้วย LF ไบต์ในฐานข้อมูลวัตถุ นั่นไม่ใช่เรื่องสนุกที่จะแก้ไขข้อบกพร่อง

หากคุณต้องใช้* text=autoให้ใส่เป็นบรรทัดแรก.gitattributesเพื่อให้บรรทัดต่อมาสามารถแทนที่ได้ สิ่งนี้ดูเหมือนจะกลายเป็นแนวทางปฏิบัติที่ได้รับความนิยมมากขึ้นเรื่อย ๆ


2
ทำไมทุกคนถึงเรียก LF ว่า Normal แต่ไม่ใช่ CRLF? มีการอ้างอิงเพื่อพิสูจน์หรือไม่?
Yousha Aleayoub

1
@YoushaAleayoub คุณหมายถึงอะไร?
Flimm

1
@YoushaAleayoub ถ้าคุณeveryoneหมายถึงgit-scmมันอาจจะเป็นเพราะพวกเขากำลังพัฒนาแพคเกจ * ระวังและทำให้การใช้ตัวอักษร * ระวังการขึ้นบรรทัดใหม่เป็นปกติ
Justin Moh

4
@YoushaAleayoub LF ถือเป็น b / c "ปกติ" ซึ่งเป็นเรื่องปกติในเครื่องมือ dev จำนวนมาก เครื่องมือ dev ยอดนิยมเช่นgit-scmมาจาก * nix MacOS ใช้ LF เฉพาะ Windows (พิจารณาจากระบบปฏิบัติการกระแสหลักเท่านั้น) ที่ใช้ CRLF ทำให้ยากขึ้นสำหรับ devs โดยใช้เครื่องมือ * nix บน Windows และสำหรับทุกคนเมื่อแลกเปลี่ยนไฟล์ ดูเพิ่มเติมทำไม CRLF
ร้อยทั้งร้อย

2
@Flimm ช่วยอธิบายความแตกต่างระหว่าง*.txt text=autoและ*.txt textโปรดได้ไหม? ฉันคิดว่าทั้ง 4 บรรทัดในตัวอย่างของคุณข้างต้นควรเป็นtext=autoไม่ใช่แค่textหลังนามสกุลไฟล์ ไฟล์ KiCad footprint เช่น (นามสกุล ".kicad_mod") ถูกทำให้เป็นมาตรฐานโดยใช้บรรทัดนี้ในไฟล์ gitattributes: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 )
Gabriel Staples

64

เพื่อให้แน่ใจว่าการสิ้นสุดบรรทัดเป็นแบบปกติ ที่มา: Kernel.org

เมื่อข้อความถูกตั้งค่าเป็น "อัตโนมัติ" เส้นทางจะถูกทำเครื่องหมายสำหรับการทำให้เป็นมาตรฐานอัตโนมัติในตอนท้ายของบรรทัด หากคอมไพล์ตัดสินใจว่าเนื้อหาเป็นข้อความการลงท้ายบรรทัดจะถูกปรับให้เป็น LF เมื่อทำการเช็คอิน

หากคุณต้องการทำงานร่วมกับระบบจัดการซอร์สโค้ดที่บังคับใช้ end-of-line normalization หรือคุณเพียงแค่ต้องการให้ไฟล์ข้อความทั้งหมดในที่เก็บของคุณถูกทำให้เป็นมาตรฐานคุณควรตั้งค่าแอตทริบิวต์ text เป็น "auto" สำหรับไฟล์ทั้งหมดแทน

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


12
คุณหมายถึงอะไรเมื่อสิ้นสุดบรรทัดปกติ
Fizer Khan

14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych

11
สิ่งสำคัญที่ต้องรู้สิ่งนี้จะเขียนทับการตั้งค่า core.autocrlf ในเครื่องของคุณดูคำตอบที่ยอดเยี่ยมนี้โดย @Daniel Jomphe
spankmaster79

1
มันจะดีมากถ้า git ไม่ได้ $% # กับไฟล์ใด ๆ ที่ถูกเช็คอินในที่เก็บ ฉันเคยทำงานกับ SLM, PerForce, MsBuild, Source Depot, TFS, SVM สิ่งเหล่านี้จะไม่เปลี่ยนแปลงแม้แต่ไบต์เดียวในไฟล์ใด ๆ ของคุณนี่เป็นการแฮ็กคอมไพล์ IMO ที่ร้ายกาจและทำให้ฉันเจ็บปวดมาก
Vance McCorkle

1
สิ่งที่เกิดขึ้นในการชำระเงินเป็นเพียงครึ่งหนึ่งของเรื่องราว - จะเกิดอะไรขึ้นเมื่อได้รับ? มันถูกต้องหรือไม่ที่จะบอกว่าในการชำระเงินจุดสิ้นสุดของบรรทัดจะยังคงอยู่เหมือนLFเดิมแม้กระทั่งบน Windows
Anthony

8

การกำหนดค่านั้นขึ้นอยู่กับวิธีจัดการกับจุดสิ้นสุดบรรทัด เมื่อเปิดใช้งานปลายบรรทัดทั้งหมดจะถูกแปลงเป็น LF ในที่เก็บ มีแฟล็กอื่น ๆ เพื่อจัดการกับวิธีการแปลงส่วนท้ายบรรทัดในไดเร็กทอรีการทำงานของคุณ ดูข้อมูลทั้งหมดเกี่ยวกับปัญหาได้ที่นี่: https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

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