คำตอบ:
เกือบสี่ปีหลังจากถามคำถามนี้ในที่สุดฉันก็ได้พบคำตอบที่ทำให้ฉันพอใจอย่างสมบูรณ์ !
ดูรายละเอียดในGitHub: ความช่วยเหลือของแนวทางในการ จัดการกับปลายสาย
Git อนุญาตให้คุณตั้งค่าคุณสมบัติการสิ้นสุดบรรทัดสำหรับ repo โดยตรงโดยใช้แอททริบิวข้อความใน
.gitattributes
ไฟล์ ไฟล์นี้มีความมุ่งมั่นใน repo และแทนที่การcore.autocrlf
ตั้งค่าช่วยให้คุณมั่นใจได้ว่าพฤติกรรมที่สอดคล้องกันสำหรับผู้ใช้ทั้งหมดโดยไม่คำนึงถึงการตั้งค่า git ของพวกเขา
และด้วยเหตุนี้
ข้อดีของการตั้งค่านี้คือการตั้งค่าการสิ้นสุดบรรทัดของคุณเดินทางไปกับที่เก็บข้อมูลของคุณแล้วและคุณไม่ต้องกังวลว่าผู้ทำงานร่วมกันจะมีการตั้งค่าระดับโลกที่เหมาะสมหรือไม่
นี่คือตัวอย่างของ.gitattributes
ไฟล์
# Auto detect text files and perform LF normalization
* text=auto
*.cs text diff=csharp
*.java text diff=java
*.html text diff=html
*.css text
*.js text
*.sql text
*.csproj text merge=union
*.sln text merge=union eol=crlf
*.docx diff=astextplain
*.DOCX diff=astextplain
# absolute paths are ok, as are globs
/**/postinst* text eol=lf
# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol=lf
มีการรวบรวมไฟล์. gitattributes พร้อมใช้งานที่สะดวกสำหรับภาษาการเขียนโปรแกรมยอดนิยม มันมีประโยชน์ที่จะเริ่มต้นให้คุณ
เมื่อคุณสร้างหรือปรับของคุณ.gitattributes
คุณควรดำเนินการครั้งหนึ่งและสำหรับทุกปลายสายอีกครั้งฟื้นฟู
โปรดทราบว่าแอปGitHub เดสก์ท็อปสามารถแนะนำและสร้าง.gitattributes
ไฟล์ได้หลังจากที่คุณเปิด Git repo ของโครงการในแอป หากต้องการลองใช้งานให้คลิกไอคอนรูปเฟือง (ที่มุมขวาบน)> การตั้งค่าพื้นที่เก็บข้อมูล ... > การสิ้นสุดบรรทัดและแอตทริบิวต์ คุณจะถูกขอให้เพิ่มคำแนะนำ.gitattributes
และถ้าคุณเห็นด้วยแอปจะทำการปรับมาตรฐานไฟล์ทั้งหมดในที่เก็บของคุณ
ในที่สุด, Mind the End of Your Lineจะให้ข้อมูลพื้นฐานเพิ่มเติมและอธิบายว่า Git มีการพัฒนาในเรื่องนี้อย่างไร ฉันพิจารณาการอ่านที่จำเป็นนี้
คุณอาจมีผู้ใช้ในทีมของคุณที่ใช้ EGit หรือ JGit (เครื่องมือเช่น Eclipse และ TeamCity ใช้พวกเขา) เพื่อยอมรับการเปลี่ยนแปลงของพวกเขา ถ้าอย่างนั้นคุณก็โชคไม่ดีอย่างที่ @gatinueta อธิบายไว้ในความคิดเห็นของคำตอบนี้:
การตั้งค่านี้จะไม่ทำให้คุณพึงพอใจหากคุณมีคนทำงานกับ Egit หรือ JGit ในทีมของคุณเนื่องจากเครื่องมือเหล่านั้นจะไม่สนใจ. gitattributes และตรวจสอบไฟล์ CRLF อย่างมีความสุข https://bugs.eclipse.org/bugs/show_bug.cgi? id = 342372
เคล็ดลับอย่างหนึ่งก็คือให้พวกเขาส่งมอบการเปลี่ยนแปลงในลูกค้ารายอื่น SourceTree ทีมของเรากลับชอบเครื่องมือนั้นต่อ EGIT ของ Eclipse สำหรับกรณีการใช้งานมากมาย
ใครบอกว่าซอฟต์แวร์นั้นง่าย : - /
.gitattributes
GitHub สำหรับ Windows แนะนำอะไรให้กับโครงการของคุณ ฉันติดตั้ง GitHub สำหรับ Windows เริ่มเวอร์ชัน GUI และไม่พบตัวเลือกที่เกี่ยวข้องกับ.gitattributes
คำแนะนำ
core.autocrlf = false
- ฉันชอบ LF ทุกที่ แต่เครื่องมือ Windows บางตัวเช่น Visual Studio ยืนยันในตอนจบของ CRLF ในไฟล์บางไฟล์ การไม่ต้องปิดปลายสายเป็นตัวเลือกที่ปลอดภัยที่สุด หากคุณรู้ว่าคุณกำลังทำอะไรฉันอาจใช้core.autocrlf = input
และสร้างข้อยกเว้นสำหรับโครงการบน Windows ที่คุณรู้ว่ามีความอ่อนไหวต่อการสิ้นสุดของบรรทัด ดังที่คนอื่น ๆ ชี้ให้เห็นเครื่องมือแก้ไขข้อความที่เหมาะสมทุกประเภทสนับสนุนการจบ LF ในตอนนี้ จริง ๆ แล้วฉันคิดว่าcore.autocrlf = true
อาจทำให้เกิดปัญหามากกว่าที่ป้องกันได้
อย่าแปลงจุดสิ้นสุดของบรรทัด มันไม่ใช่หน้าที่ของ VCS ในการตีความข้อมูล - เพียงแค่เก็บและจัดทำข้อมูล เครื่องมือแก้ไขข้อความที่ทันสมัยทุกตัวสามารถอ่านการจบบรรทัดทั้งสองประเภทได้
คุณมักจะต้องการautocrlf=input
เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่
บริบทเพิ่มเติมด้านล่าง:
มันควรจะเป็นอย่างใดอย่างหนึ่ง
core.autocrlf=true
ถ้าคุณชอบจบ DOS หรือcore.autocrlf=input
ถ้าคุณชอบบรรทัดใหม่ยูนิกซ์ ในทั้งสองกรณีที่เก็บ Git ของคุณจะมีเฉพาะ LF ซึ่งเป็นสิ่งที่ถูกต้อง อาร์กิวเมนต์เพียงอย่างเดียวcore.autocrlf=false
คือการแก้ปัญหาโดยอัตโนมัตินั้นอาจตรวจพบไบนารีบางอย่างไม่ถูกต้องเป็นข้อความและไทล์ของคุณจะเสียหาย ดังนั้นจึงcore.safecrlf
มีการแนะนำตัวเลือกเพื่อเตือนผู้ใช้หากมีการเปลี่ยนแปลงที่เกิดขึ้นไม่ได้ ในความเป็นจริงมีความเป็นไปได้สองอย่างในการเปลี่ยนแปลงที่ไม่สามารถย้อนกลับได้ - การผสมบรรทัดสุดท้ายในไฟล์ข้อความในการทำให้เป็นมาตรฐานเป็นสิ่งที่ต้องการดังนั้นคำเตือนนี้อาจถูกละเว้นหรือ (ไม่น่าเป็นไปได้มาก) จากนั้นคุณต้องใช้แอตทริบิวต์เพื่อบอก Git ว่าไฟล์นี้เป็นไบนารี
ย่อหน้าข้างต้นเดิมถูกดึงออกมาจากกระทู้ใน gmane.org แต่หลังจากลงไปแล้ว
core.autocrlf=input
เป็นคำตอบที่ยอมรับได้ สำหรับกรณีการใช้งานส่วนใหญ่core.autocrlf=true
และcore.autocrlf=false
มีความกระตือรือร้นสูงเกินไป (... ในทางตรงกันข้าม "Git สำหรับ Windows" ควรจริงๆได้มาพร้อมกับ "ชำระเงินตามที่เป็นกระทำ Unix สไตล์ปลายสาย" (กล่าวคือcore.autocrlf=input
) เป็นกลยุทธ์การขึ้นบรรทัดใหม่เริ่มต้น มันไม่ได้ ดังนั้นที่นี่เราอยู่ที่นี่ - ใน frickin '2015 - ยังคงถกเถียงกันอย่างนี้
สองกลยุทธ์ทางเลือกเพื่อให้สอดคล้องกันกับจุดสิ้นสุดบรรทัดในสภาพแวดล้อมแบบผสม (Microsoft + Linux + Mac):
1) แปลงทั้งหมดเป็นรูปแบบเดียว
find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'
2) ตั้งค่าcore.autocrlf
เป็นinput
บน Linux / UNIX หรือtrue
บน MS Windows (พื้นที่เก็บข้อมูลหรือทั่วโลก)
git config --global core.autocrlf input
3) [ไม่บังคับ] ตั้งค่าcore.safecrlf
เป็นtrue
(เพื่อหยุด) หรือwarn
(เพื่อร้องเพลง :) เพื่อเพิ่มการป้องกันพิเศษหากการแปลงบรรทัดขึ้นบรรทัดใหม่กลับรายการจะส่งผลให้ไฟล์เดียวกัน
git config --global core.safecrlf true
1) แปลงทั้งหมดเป็นรูปแบบเดียว
find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'
2) เพิ่ม.gitattributes
ไฟล์ลงในที่เก็บของคุณ
echo "* text=auto" > .gitattributes
git add .gitattributes
git commit -m 'adding .gitattributes for unified line-ending'
ไม่ต้องกังวลกับไฟล์ไบนารีของคุณ - Git ควรฉลาดพอสำหรับไฟล์
dos2unix
เป็นเครื่องมือบรรทัดคำสั่งที่ขึ้นอยู่กับระบบที่คุณอาจต้องติดตั้งเพิ่มเติม
dos2unix
- มีความเสี่ยงที่จะเกิดความเสียหาย.git/index
และเราไม่จำเป็นต้องใช้มันกับทุกไฟล์ จะเป็นการดีกว่าหากใช้สิ่งที่ต้องการfind ./ -name "*.html"
และระบุไฟล์ที่คุณต้องการใช้กับมัน
find
บรรทัดให้ระวัง: สิ่งdos2unix
ที่มาพร้อมกับ Git สำหรับ Windows นั้นมีพฤติกรรมแปลก ๆ (IMO idiotic และอันตราย) โดยไม่มีข้อโต้แย้ง: แทนที่จะเปลี่ยนเป็น UNIX มันจะสลับรูปแบบขึ้นบรรทัดใหม่ (DOS <-> UNIX )
ลองตั้งค่าตัวเลือกการกำหนดค่าcore.autocrlf
true
ยังได้ดูที่core.safecrlf
ตัวเลือก
ที่จริงดูเหมือนว่าcore.safecrlf
อาจมีการตั้งค่าในพื้นที่เก็บข้อมูลของคุณเพราะ (เน้นเหมือง):
ถ้ากรณีนี้ไม่ได้สำหรับการตั้งค่าปัจจุบันของ core.autocrlf, คอมไพล์จะปฏิเสธไฟล์
หากเป็นกรณีนี้คุณอาจต้องการตรวจสอบว่าตัวแก้ไขข้อความของคุณได้รับการกำหนดค่าให้ใช้การสิ้นสุดบรรทัดอย่างสม่ำเสมอ คุณอาจพบปัญหาหากไฟล์ข้อความมีส่วนผสมของการสิ้นสุดบรรทัด LF และ CRLF
ในที่สุดฉันรู้สึกว่าคำแนะนำเพียง "ใช้สิ่งที่คุณได้รับ" และใช้ LF ที่ถูกยกเลิกบรรทัดบน Windows จะทำให้เกิดปัญหามากกว่าที่จะแก้ไข Git มีตัวเลือกด้านบนเพื่อพยายามจัดการกับจุดสิ้นสุดของเส้นอย่างสมเหตุสมผลดังนั้นจึงเหมาะสมที่จะใช้
การใช้core.autocrlf=false
หยุดไฟล์ทั้งหมดไม่ให้ทำเครื่องหมายอัปเดตทันทีที่ฉันเช็กเอาต์ไฟล์เหล่านั้นในVisual Studio 2010ของฉันโครงการสมาชิกอีกสองคนของทีมพัฒนากำลังใช้ระบบ Windows ด้วยดังนั้นสภาพแวดล้อมแบบผสมไม่ได้เล่นอยู่ แต่การตั้งค่าเริ่มต้นที่มาพร้อมกับที่เก็บจะทำเครื่องหมายไฟล์ทั้งหมดว่าอัปเดตทันทีหลังจากการโคลน
ฉันเดาว่าสิ่งที่สำคัญที่สุดคือการค้นหาการตั้งค่า CRLF ที่เหมาะกับสภาพแวดล้อมของคุณ โดยเฉพาะอย่างยิ่งเนื่องจากในที่เก็บอื่น ๆ บนการตั้งค่ากล่อง Linux ของเราautocrlf = true
ให้ผลลัพธ์ที่ดีกว่า
มากกว่า 20 ปีต่อมาและเรายังคงต้องเผชิญกับความขัดแย้งที่ไม่สิ้นสุดระหว่างระบบปฏิบัติการ ... เศร้า
นี่คือสองตัวเลือกสำหรับผู้ใช้ WindowsและVisual Studio ที่ใช้รหัสร่วมกับผู้ใช้MacหรือLinux สำหรับคำอธิบายเพิ่มเติมให้อ่านคู่มือ gitattributesคู่มือ
ใน.gitattributes
ไฟล์repo ของคุณเพิ่ม:
* text=auto
นี่จะทำให้ไฟล์ทั้งหมดเป็นปกติด้วย LF
สิ้นสุดบรรทัดใน repo
และขึ้นอยู่กับระบบปฏิบัติการของคุณ ( core.eol
การตั้งค่า) ไฟล์ในแผนผังการทำงานจะถูกทำให้เป็นมาตรฐานLF
สำหรับระบบที่ใช้ Unix หรือCRLF
ระบบ Windows
นี่คือการกำหนดค่าที่Microsoft .NET repos ใช้
ตัวอย่าง:
Hello\r\nWorld
จะถูกทำให้เป็นมาตรฐานใน repo เสมอเช่น:
Hello\nWorld
เมื่อทำการเช็คเอาต์แผนผังการทำงานใน Windows จะถูกแปลงเป็น:
Hello\r\nWorld
เมื่อชำระเงินต้นไม้ทำงานใน Mac จะถูกปล่อยเป็น:
Hello\nWorld
หมายเหตุ: หาก repo ของคุณมีไฟล์ที่ไม่ได้รับการทำให้เป็นมาตรฐานแล้ว
git status
จะแสดงไฟล์เหล่านี้เมื่อมีการแก้ไขอย่างสมบูรณ์ในครั้งต่อไปที่คุณทำการเปลี่ยนแปลงใด ๆ และอาจเป็นปัญหาสำหรับผู้ใช้รายอื่นที่จะรวมการเปลี่ยนแปลงในภายหลัง ดูการรีเฟรชที่เก็บหลังจากเปลี่ยนการสิ้นสุดบรรทัดสำหรับข้อมูลเพิ่มเติม
หากtext
ไม่ได้ระบุใน.gitattributes
ไฟล์ Git จะใช้core.autocrlf
ตัวแปรการกำหนดค่าเพื่อพิจารณาว่าควรแปลงไฟล์นั้นหรือไม่
สำหรับผู้ใช้ Windows git config --global core.autocrlf true
เป็นตัวเลือกที่ดีเพราะ:
LF
บรรทัดสุดท้ายที่สิ้นสุดเมื่อเพิ่มลงใน repo เท่านั้น หากมีไฟล์ที่ไม่ได้รับการทำให้เป็นมาตรฐานใน repo การตั้งค่านี้จะไม่แตะต้องCRLF
จุดสิ้นสุดบรรทัดในไดเรกทอรีการทำงานปัญหาของวิธีนี้คือ:
autocrlf = input
คุณจะเห็นไฟล์หลายไฟล์ที่LF
ลงท้ายด้วยบรรทัด ไม่ใช่อันตรายสำหรับคนอื่น ๆ ในทีมเพราะความมุ่งมั่นของคุณจะยังคงเป็นมาตรฐานด้วยการLF
จบบรรทัดcore.autocrlf = false
คุณจะเห็นกลุ่มไฟล์ที่มีการLF
สิ้นสุดบรรทัดและคุณอาจแนะนำไฟล์ที่มีการCRLF
ลงท้ายบรรทัดลงใน repoautocrlf = input
และอาจได้รับไฟล์ที่มีCRLF
ตอนจบไฟล์อาจจะมาจากผู้ใช้ Windows core.autocrlf = false
ด้วยgit config --global core.autocrl true
กล่าวว่า git config --global core.autocrlf true
คุณหมายถึง
พิจารณากรณีที่ผู้ใช้ windows ชอบทำงานCRLF
และผู้ใช้ linux / mac ชอบทำงานกับLF
ไฟล์ข้อความ ให้คำตอบจากมุมมองของผู้ดูแลพื้นที่เก็บข้อมูล :
สำหรับฉันกลยุทธ์ที่ดีที่สุด (ปัญหาที่ต้องแก้ไขน้อยกว่า) คือ: เก็บไฟล์ข้อความทั้งหมดไว้ด้วยLF
คอมไพล์ repo ภายในแม้ว่าคุณจะทำงานในโครงการหน้าต่างเท่านั้น จากนั้นให้อิสระกับลูกค้าในการทำงานในรูปแบบบรรทัดสุดท้ายของการตั้งค่าของพวกเขาหากพวกเขาเลือกcore.autocrlf
ค่าคุณสมบัติที่จะเคารพกลยุทธ์ของคุณ (LF on repo)ในขณะที่จัดเตรียมไฟล์สำหรับการส่งมอบ
การจัดเตรียมเป็นสิ่งที่หลายคนสับสนเมื่อพยายามทำความเข้าใจว่ากลยุทธ์การขึ้นบรรทัดใหม่ทำงานอย่างไร มันเป็นสิ่งจำเป็นที่จะยกเลิกการจุดต่อไปนี้ก่อนที่จะเลือกค่าที่ถูกต้องสำหรับcore.autocrlf
คุณสมบัติ:
.git/
ไดเรกทอรีย่อยที่มีการสิ้นสุดบรรทัดที่แปลง (ขึ้นอยู่กับcore.autocrlf
ค่าของการกำหนดค่าไคลเอนต์ของคุณ) ทั้งหมดนี้ทำในท้องถิ่น core.autocrlf
เป็นเหมือนการให้คำตอบสำหรับคำถาม (คำถามเดียวกันที่แน่นอนในทุกระบบปฏิบัติการ):
false:
" ไม่ทำสิ่งใด ๆข้างต้น ",input:
" ทำแค่ข "true
: "ทำและและ b "โชคดี
core.autocrlf: true
:, linux / mac:)
core.autocrlf: false
จะเข้ากันได้กับกลยุทธ์LF-only-repo น่าเสียดาย:
core.autocrlf
ค่าgitcore.autocrlf=false
และเพิ่มไฟล์ด้วย CRLF สำหรับการกระทำในการตรวจจับไฟล์ข้อความที่ไม่ใช่ lf โดย ASAP ที่ได้รับมอบหมายจากไคลเอนต์ข้างต้นคุณสามารถทำตามสิ่งที่อธิบายไว้ใน --- update 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
, สำหรับลูกค้าที่คอมไพล์โดยใช้: --with-libpcre
flag)
และนี่คือการจับ: ฉันในฐานะผู้ดูแล repo เก็บไว้git.autocrlf=input
เพื่อให้ฉันสามารถแก้ไขไฟล์ที่มีข้อผิดพลาดเพียงแค่เพิ่มไฟล์เหล่านั้นอีกครั้งสำหรับคอมมิท และฉันให้ข้อความกระทำ: "แก้ไขไฟล์มุ่งมั่นผิด"
เท่าที่.gitattributes
ถูกปกปิดไว้ ฉันไม่นับเพราะมีลูกค้า UI มากขึ้นที่ไม่เข้าใจ ฉันใช้มันเพื่อให้คำแนะนำสำหรับไฟล์ข้อความและไบนารีเท่านั้นและอาจตั้งค่าสถานะไฟล์พิเศษบางอย่างที่ทุกแห่งควรจะรักษาจุดสิ้นสุดของบรรทัดไว้เหมือนกัน:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
คำตอบ:เพื่อหลีกเลี่ยงการเปลี่ยนตัวอักษรกระทำเดียวปรากฏเป็นการเปลี่ยนแปลง 5000 บรรทัดเพียงเพราะลูกค้าที่ดำเนินการเปลี่ยนแปลงอัตโนมัติแปลงไฟล์เต็มจาก crlf เป็น lf (หรือตรงกันข้าม) ก่อนที่จะเพิ่มมันสำหรับการกระทำ นี้อาจจะค่อนข้างเจ็บปวดเมื่อมีการแก้ปัญหาความขัดแย้งที่เกี่ยวข้อง หรือในบางกรณีอาจเป็นสาเหตุของความขัดแย้งที่ไม่สมเหตุสมผล
dafaults ของไคลเอนต์ git จะทำงานในกรณีส่วนใหญ่ แม้ว่าคุณจะมีเพียง windows client เท่านั้น แต่ลูกค้า linux เท่านั้นหรือทั้งสอง เหล่านี้คือ:
core.autocrlf=true
หมายถึงแปลงสายเป็น CRLF เมื่อชำระเงินและแปลงเป็น LF เมื่อเพิ่มไฟล์core.autocrlf=input
หมายถึงไม่ต้องแปลงบรรทัดในการชำระเงิน (ไม่จำเป็นต้องเนื่องจากไฟล์ที่คาดว่าจะผูกมัดกับ LF) และแปลงบรรทัดเป็น LF (ถ้าจำเป็น) เมื่อเพิ่มไฟล์ ( - update3 - : ดูเหมือนว่านี่เป็นfalse
ค่าเริ่มต้น แต่ก็ใช้ได้อีกครั้ง)สามารถตั้งค่าคุณสมบัติในขอบเขตที่แตกต่างกัน ฉันขอแนะนำให้ตั้งค่าอย่างชัดเจนใน--global
ขอบเขตเพื่อหลีกเลี่ยงปัญหา IDE บางอย่างที่อธิบายไว้ในตอนท้าย
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
นอกจากนี้ฉันขอแนะนำอย่างยิ่งให้ใช้บน windows git config --global core.autocrlf false
(ในกรณีที่คุณมี windows ไคลเอ็นต์เท่านั้น) ซึ่งแตกต่างจากที่เสนอ เอกสาร gitเอกสารคอมไพล์การตั้งค่าเป็นเท็จจะส่งไฟล์ด้วย CRLF ใน repo แต่ไม่มีเหตุผลจริงๆ คุณไม่มีทางรู้ว่าคุณจะต้องแชร์โครงการกับผู้ใช้ linux หรือไม่ นอกจากนี้ยังเป็นหนึ่งขั้นตอนพิเศษสำหรับลูกค้าแต่ละรายที่เข้าร่วมโครงการแทนที่จะใช้ค่าเริ่มต้น
ตอนนี้สำหรับกรณีพิเศษของไฟล์ (เช่น*.bat
*.sh
) ที่คุณต้องการให้พวกเขาเช็คเอาท์ด้วย LF หรือ CRLF คุณสามารถใช้.gitattributes
สรุปการปฏิบัติที่ดีที่สุดสำหรับฉันคือ:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( หมายเหตุ:บนไคลเอนต์ windows ทำงานผ่านgit-bash
ไคลเอนต์ linux เท่านั้นและต่อเมื่อคอมไพล์โดยใช้--with-libpcre
ใน./configure
)core.autocrlf=input
( --- อัปเดต 3 - ).gitattributes
core.autocrlf
อธิบายไว้ข้างต้นเป็นค่าเริ่มต้น.gitattributes
ในการปรากฏตัวของ git-clients ของ IDEs อาจเพิกเฉยหรือทำให้แตกต่างกันตามที่กล่าวมาบางสิ่งสามารถเพิ่มในคุณลักษณะ git:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
ฉันคิดว่าตัวเลือกที่ปลอดภัยอื่น ๆ.gitattributes
แทนการใช้การตรวจจับอัตโนมัติสำหรับไฟล์ไบนารี:
-text
(เช่นสำหรับ*.zip
หรือ*.jpg
ไฟล์: จะไม่ถือว่าเป็นข้อความดังนั้นจะไม่มีการพยายามแปลงที่ลงท้ายด้วยบรรทัด Diff อาจเป็นไปได้ผ่านโปรแกรมแปลง)text !eol
(เช่น*.java
, *.html
:.. ถือว่าเป็นข้อความ แต่การตั้งค่ารูปแบบ EOL ไม่ได้ตั้งค่าการตั้งค่าดังนั้นลูกค้าจะใช้)-text -diff -merge
(เช่นสำหรับ*.hugefile
: ไม่ถือว่าเป็นข้อความไม่สามารถเป็นไปได้ / รวมกัน)ตัวอย่างหนึ่งที่เจ็บปวดของลูกค้าที่จะส่งไฟล์ผิด:
NetBeans 8.2 (หน้าต่าง) ผิดจะกระทำไฟล์ข้อความทั้งหมดที่มีCRLFs เว้นแต่คุณได้อย่างชัดเจนตั้งเป็นระดับโลกcore.autocrlf
สิ่งนี้ขัดแย้งกับพฤติกรรมไคลเอ็นต์ git มาตรฐานและทำให้เกิดปัญหามากมายในภายหลังในขณะที่อัพเดต / รวม นี่คือสิ่งที่ทำให้บาง ไฟล์ปรากฏที่แตกต่างกัน (แม้ว่าพวกเขาไม่ได้) แม้เมื่อคุณย้อนกลับ
พฤติกรรมเดียวกันใน netbeans เกิดขึ้นแม้ว่าคุณได้เพิ่มความถูกต้อง.gitattributes
ให้กับโครงการของคุณ
การใช้คำสั่งต่อไปนี้หลังจากการคอมมิท, อย่างน้อยจะช่วยให้คุณตรวจพบตั้งแต่เนิ่น ๆ ว่า git repo ของคุณมีปัญหาการสิ้นสุดบรรทัด: git grep -I --files-with-matches --perl-regexp '\r' HEAD
ฉันใช้เวลาหลายชั่วโมงเพื่อหาวิธีที่ดีที่สุดเท่าที่จะเป็นไปได้.gitattributes
ในที่สุดเพื่อตระหนักว่าฉันไม่สามารถเชื่อใจได้
น่าเสียดายที่ตราบใดที่มีเอดิเตอร์ที่ใช้ JGit อยู่ (ซึ่งไม่สามารถจัดการ.gitattributes
ได้อย่างถูกต้อง) โซลูชันที่ปลอดภัยคือบังคับให้ LF ทุกที่แม้แต่ในระดับเอดิเตอร์
ใช้anti-CRLF
น้ำยาฆ่าเชื้อต่อไปนี้
ลูกค้า windows / linux: core.autocrlf=input
มุ่งมั่น.gitattributes
: * text=auto eol=lf
กระทำ.editorconfig
( http://editorconfig.org/ ) ซึ่งเป็นรูปแบบที่ได้มาตรฐานรวมกับปลั๊กอินแก้ไข:
.gitattributes
บรรทัดของคุณมันมีผลลัพธ์ที่ไม่ตั้งใจใน Git <2.10, ดูstackoverflow.com/a/29508751/2261442
git config --global core.autocrlf false
และแนะนำให้จัดการกับ eol ใน.gitattributes
คำสั่งเท่านั้น
นี่เป็นเพียงวิธีแก้ปัญหา:
ในกรณีปกติให้ใช้วิธีแก้ปัญหาที่มาพร้อมกับ git ใช้งานได้ดีในกรณีส่วนใหญ่ บังคับให้เป็น LF หากคุณแบ่งปันการพัฒนาบนระบบที่ใช้ Windows และ Unix ด้วยการตั้งค่า. gitattributes
ในกรณีของฉันมีโปรแกรมเมอร์มากกว่า 10 คนกำลังพัฒนาโครงการใน Windows โปรเจ็กต์นี้ถูกเช็กอินด้วย CRLF และไม่มีตัวเลือกในการบังคับให้ LF
การตั้งค่าบางอย่างถูกเขียนขึ้นภายในเครื่องของฉันโดยไม่มีผลกับรูปแบบ LF ดังนั้นไฟล์บางไฟล์จึงถูกเปลี่ยนเป็น LF ทั่วโลกในการเปลี่ยนแปลงไฟล์ขนาดเล็กแต่ละไฟล์
ทางออกของฉัน:
Windows-Machines: ให้ทุกอย่างเหมือนเดิม ไม่ต้องสนใจอะไรเลยเนื่องจากคุณเป็นนักพัฒนา 'หมาป่าโลน' ที่เป็นหน้าต่างเริ่มต้นและคุณต้องจัดการดังนี้: "ไม่มีระบบอื่นในโลกกว้างใช่ไหม"
Unix-เครื่อง
เพิ่มบรรทัดต่อไปนี้ใน[alias]
ส่วนของการกำหนดค่า คำสั่งนี้แสดงรายการไฟล์ที่ถูกเปลี่ยนแปลง (เช่นที่ถูกแก้ไข / ใหม่):
lc = "!f() { git status --porcelain \
| egrep -r \"^(\?| ).\*\\(.[a-zA-Z])*\" \
| cut -c 4- ; }; f "
แปลงไฟล์ที่เปลี่ยนแปลงทั้งหมดเหล่านั้นเป็นรูปแบบ dos:
unix2dos $(git lc)
ทางเลือก ...
สร้าง git hookสำหรับการกระทำนี้เพื่อทำให้กระบวนการนี้เป็นแบบอัตโนมัติ
ใช้พารามิเตอร์และรวมมันและแก้ไขgrep
ฟังก์ชั่นเพื่อให้ตรงกับชื่อไฟล์เฉพาะเช่น:
... | egrep -r "^(\?| ).*\.(txt|conf)" | ...
รู้สึกสะดวกสบายยิ่งขึ้นด้วยการใช้ทางลัดเพิ่มเติม:
c2dos = "!f() { unix2dos $(git lc) ; }; f "
... และไล่สิ่งที่แปลงแล้วด้วยการพิมพ์
git c2dos
.gitattributes
หรือไม่