สาเหตุที่เป็นไปได้ # 1 - การวางบรรทัดฐานการสิ้นสุดบรรทัด
สถานการณ์หนึ่งที่สิ่งนี้สามารถเกิดขึ้นได้คือเมื่อไฟล์ที่มีปัญหาถูกตรวจสอบลงในที่เก็บโดยไม่มีการกำหนดค่าที่ถูกต้องสำหรับการจบบรรทัด (1) ส่งผลให้ไฟล์ในที่เก็บมีการสิ้นสุดของบรรทัดที่ไม่ถูกต้อง หากต้องการยืนยันให้ตรวจสอบว่าgit diff
แสดงเฉพาะการเปลี่ยนแปลงในตอนท้ายบรรทัด (อาจไม่สามารถมองเห็นได้ตามค่าเริ่มต้นให้ลองgit diff | cat -v
ดูการขึ้นบรรทัดใหม่ตามตัวอักษร)^M
อักษร)
ต่อจากนั้นอาจมีบางคนเพิ่ม.gitattributes
หรือแก้ไขการcore.autocrlf
ตั้งค่าเพื่อทำให้บรรทัดสุดท้ายของบรรทัดสิ้นสุด (2) ตาม.gitattributes
Git หรือการกำหนดค่าระดับโลก Git ได้นำการเปลี่ยนแปลงในท้องถิ่นไปใช้กับสำเนาการทำงานของคุณซึ่งใช้บรรทัดที่ลงท้ายด้วยการทำให้เป็นมาตรฐานที่ร้องขอ น่าเสียดายด้วยเหตุผลบางอย่างgit reset --hard
ไม่ได้ยกเลิกการเปลี่ยนแปลงบรรทัดมาตรฐานเหล่านี้
สารละลาย
วิธีแก้ปัญหาที่การตั้งค่าการจบสายภายในเครื่องจะไม่สามารถแก้ปัญหาได้ ทุกครั้งที่ไฟล์ถูก "เห็น" โดยคอมไพล์มันจะลองและนำมาตรฐานมาใช้ใหม่ซึ่งจะทำให้เกิดปัญหาเดียวกัน
ตัวเลือกที่ดีที่สุดคือให้ git ใช้การปรับมาตรฐานที่ต้องการโดยการทำให้บรรทัดที่ลงท้ายด้วย repo กลับมาเป็น.gitattributes
ปกติและจับการเปลี่ยนแปลงเหล่านั้น - ดูที่การพยายามแก้ไขจุดสิ้นสุดของบรรทัดด้วย git filter-branch แต่ไม่มีโชคแต่มีโชคไม่
หากคุณต้องการลองและย้อนกลับการเปลี่ยนแปลงของไฟล์ด้วยตนเองดูเหมือนว่าวิธีที่ง่ายที่สุดคือการลบไฟล์ที่แก้ไขแล้วบอก git ให้ทำการกู้คืนแม้ว่าฉันจะทราบว่าวิธีนี้ไม่ทำงานอย่างสม่ำเสมอ 100% ของ เวลา ( คำเตือน: อย่ารันสิ่งนี้หากไฟล์ที่ถูกดัดแปลงของคุณมีการเปลี่ยนแปลงอื่นนอกเหนือจากการสิ้นสุดบรรทัด !!):
git status --porcelain | grep "^ M" | cut -c4- | xargs rm
git checkout -- .
โปรดทราบว่าหากคุณไม่ทำให้บรรทัดที่สิ้นสุดในที่เก็บเป็นปกติในบางจุดคุณจะยังคงพบปัญหานี้ต่อไป
สาเหตุที่เป็นไปได้ # 2 - ไม่รู้สึกตัวพิมพ์เล็ก - ใหญ่
สาเหตุที่สองที่เป็นไปได้คือการคำนึงถึงขนาดตัวพิมพ์บน Windows หรือ Mac OS / X ตัวอย่างเช่นสมมติว่ามีพา ธ ดังต่อไปนี้อยู่ในที่เก็บ:
/foo/bar
ตอนนี้มีคนบน Linux ยอมรับไฟล์ลง/foo/Bar
(อาจเป็นเพราะเครื่องมือสร้างหรือสิ่งที่สร้างไดเรกทอรีนั้น) และผลักดัน บน Linux ตอนนี้เป็นจริงสองไดเรกทอรีแยก:
/foo/bar/fileA
/foo/Bar/fileA
การตรวจสอบธุรกรรมซื้อคืนนี้ออกมาบน Windows หรือ Mac อาจส่งผลให้มีการปรับเปลี่ยนfileA
ที่ไม่สามารถตั้งค่าใหม่เพราะในแต่ละรีเซ็ตคอมไพล์ในการตรวจสอบของ Windows ออก/foo/bar/fileA
แล้วเนื่องจาก Windows เป็นกรณีตายเขียนทับเนื้อหาของfileA
ด้วย/foo/Bar/fileA
ผลในการให้พวกเขาได้รับการ "ปรับเปลี่ยน"
อีกกรณีหนึ่งอาจเป็นไฟล์แต่ละไฟล์ที่มีอยู่ใน repo ซึ่งเมื่อเช็กเอาต์ในระบบไฟล์ที่ไม่ตรงตามตัวพิมพ์เล็กและใหญ่ก็จะทับซ้อนกัน ตัวอย่างเช่น:
/foo/bar/fileA
/foo/bar/filea
อาจมีสถานการณ์คล้ายกันอื่น ๆ ที่อาจทำให้เกิดปัญหาดังกล่าว
คอมไพล์ในกรณีที่ระบบไฟล์ insensitive จริง ๆ ควรตรวจสอบสถานการณ์นี้และแสดงข้อความเตือนที่เป็นประโยชน์ แต่ในปัจจุบันมันไม่ได้ (อาจมีการเปลี่ยนแปลงในอนาคต - ดูการสนทนานี้และแพทช์ที่นำเสนอที่เกี่ยวข้องในรายชื่อผู้รับจดหมาย git.git)
สารละลาย
การแก้ปัญหาคือการนำกรณีของไฟล์ในดัชนี git และกรณีในระบบไฟล์ Windows ในการจัดตำแหน่ง สิ่งนี้สามารถทำได้บน Linux ซึ่งจะแสดงสถานะที่แท้จริงของสิ่งต่าง ๆ หรือบน Windows ด้วยยูทิลิตี้โอเพนซอร์สที่มีประโยชน์มากGit-Unite Git-UniteGit-Unite จะนำการเปลี่ยนแปลงกรณีที่จำเป็นไปใช้กับดัชนี git ซึ่งสามารถส่งไปยัง repo ได้
(1) นี่เป็นไปได้มากที่สุดที่บางคนใช้ Windows โดยไม่มี.gitattributes
คำจำกัดความใด ๆสำหรับไฟล์core.autocrlf
ที่เป็นfalse
ปัญหา
(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/
.
ย่อมาจากไดเรกทอรีปัจจุบันไม่ใช่ไดเรกทอรีราก