การเปลี่ยนแปลงที่ไม่ดำเนินการค้างอยู่หลังจากรีเซ็ต - คอมไพล์แล้ว


275

หลังจากgit reset --hard, git statusให้ฉันไฟล์ภายในChanges not staged for commit:ส่วน

ฉันเคยลองgit reset .แล้วgit checkout -- .และgit checkout-index -f -aก็ไม่มีประโยชน์

ดังนั้นฉันจะกำจัดการเปลี่ยนแปลงที่ไม่มีสถานะเหล่านั้นได้อย่างไร

ดูเหมือนว่าจะตีไฟล์โครงการ Visual Studio เท่านั้น แปลก. ดูวางนี้: http://pastebin.com/eFZwPn9Z มีอะไรพิเศษกับไฟล์เหล่านั้นคือใน. gitattributes ฉันมี:

*.sln        eol=crlf
*.vcproj     eol=crlf
*.vcxproj*   eol=crlf

นอกจากนี้ยังมีการตั้งค่าที่ผิดพลาดในระดับโลกของฉันautocrlf .gitconfigนั่นอาจจะเกี่ยวข้องอย่างใด?


คุณใช้คำสั่งเหล่านั้นจากรูทของที่เก็บหรือไม่? การประกาศ.ย่อมาจากไดเรกทอรีปัจจุบันไม่ใช่ไดเรกทอรีราก
Alexander

1
ฉันทำจากที่เก็บรูทแน่นอน
Norswap

gitรุ่นของคุณคืออะไร? ไม่ว่าคุณจะทำผิดพลาดโง่หรือคุณมีรุ่นเก่าที่เป็นรถ?
Shahbaz

มันคือ 1.7.4 msysgit อาจเป็นความผิดพลาด แต่คำสั่งนั้นดูง่ายพอและฉันก็ไม่สามารถเข้าใจผิดได้
Norswap

สำหรับบันทึกฉันพยายามใช้ msysgit รุ่นล่าสุด (1.7.11) รุ่นล่าสุด แต่ปัญหายังคงมีอยู่
Norswap

คำตอบ:


361

ฉันมีปัญหาเดียวกันและมันก็เกี่ยวข้องกับ.gitattributesไฟล์ อย่างไรก็ตามประเภทไฟล์ที่ก่อให้เกิดปัญหาไม่ได้ระบุไว้ใน.gitattributesแต่ประเภทของไฟล์ที่ก่อให้เกิดปัญหาที่ไม่ได้ระบุไว้ใน

ฉันสามารถแก้ไขปัญหาได้ด้วยการเรียกใช้

git rm .gitattributes
git add -A
git reset --hard

7
เป็นคำสั่ง * text = auto ในไฟล์ gitattributes มันจะเปลี่ยนจุดสิ้นสุดไฟล์โดยอัตโนมัติดังนั้นไฟล์จะถูกทำเครื่องหมายเป็น "แก้ไข" โดยอัตโนมัติเมื่อคุณตรวจสอบสถานะ
Cody Django

3
ใช้งานได้ แต่ฉันไม่เข้าใจว่าทำไม ใครสนใจอธิบายแต่ละคำสั่ง?
Edwin Stoteler

18
@NLwino git rm .gitattributesลบ. gitattributes ออกจากดัชนี git add -Aเพิ่มทั้งหมด (รวมถึงการลบ. gitattributes) ไปยังดัชนีซึ่งควรจะเป็นการลบ. gitattributes เท่านั้นหากนั่นเป็นปัญหาจริงๆ git reset --hardรีเซ็ตการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดซึ่งจะรวมถึงการลบ. gitattributes โดยพื้นฐานแล้วสิ่งนี้จะละเว้น. gitattributes (และ* text=autoคำสั่ง) สำหรับการคอมมิทด้วยการลบมันจากนั้นทำการรีเซ็ตดัชนีในขณะที่มันถูกลบดังนั้นจึงทำการใส่กลับไป แต่หลังจากที่คุณได้รีเซ็ตไฟล์อื่นแล้ว
cloudworks

4
@GameScripting โซลูชันนี้ใช้งานไม่ได้สำหรับฉัน ไม่มีไฟล์ดังกล่าวเป็น.gitattributes: "ร้ายแรง: pathspec '.gitattributes' ไม่ตรงกับไฟล์ใด ๆ "
Pacerier

4
fatal: pathspec '.gitattributes' did not match any files ฉันทำดังกล่าวและจะพูดว่า ผมทำอะไรผิดหรือเปล่า?
ฮันนี่

136

มติ !!!

ฉันได้แก้ไขปัญหานี้โดยใช้ขั้นตอนต่อไปนี้

1) ลบทุกไฟล์ออกจากดัชนีของ Git

git rm --cached -r .

2) เขียนดัชนี Git ใหม่เพื่อรับการขึ้นบรรทัดใหม่ทั้งหมด

git reset --hard

โซลูชันเป็นส่วนหนึ่งของขั้นตอนที่อธิบายไว้ในไซต์ git https://help.github.com/articles/dealing-with-line-endings/


5
มันจะทำงานเมื่อไม่มีอะไรทำ! เราได้ลองทุกอย่างในหัวข้อนี้และหัวข้ออื่น ๆ - มันเป็นทีมพัฒนาที่ยิ่งใหญ่ดังนั้นการทำให้ทุกคนใน crlf เดียวกันนั้นเป็นฝันร้าย แต่สิ่งนี้แก้ปัญหาได้
tkersh

สิ่งที่น่าสนใจ ... ฉันใช้ "git rm --chached <one_specific_file> แทนที่จะลบทุกอย่าง" สถานะ git "รายงานว่าไฟล์นั้นถูกลบและไม่ได้ติดตามแล้ว" git รีเซ็ต - ฮาร์ด "แก้ไขไฟล์นั้นและไฟล์อื่น ๆ ทั้งหมดที่ ถูกรายงานว่าเป็น "การเปลี่ยนแปลงที่ไม่จัดฉาก" (ก่อนที่จะใช้ git rm ฉันพยายามรีเซ็ตฮาร์ดอย่างไม่มีผล) ฉันรักระบบควบคุมแหล่งลึกลับเช่นนี้
joeking

คุณรู้ว่ามันจะลบแคชทั้งหมดของคุณ ในโครงการขนาดใหญ่อาจเสียเวลาอย่างมาก
Ohar

นั่นคือโหดร้าย คุณสามารถทำสิ่งเดียวกันโดยการลบไดเรกทอรี repo และการโคลนซ้ำ
ingyhere

4
พิจารณาว่าคุณใช้ Windows และไม่คำนึงถึงขนาดตัวพิมพ์ หากคุณกำลังทำงานกับนักพัฒนาที่อยู่ในระบบไฟล์ที่คำนึงถึงขนาดตัวพิมพ์เช่น Mac หรือ Linux พวกเขาอาจกำลังแท็กแยกสาขาหรือแม้แต่ไฟล์ในกรณีอื่น ในสถานการณ์นั้นดัชนีของคุณจะแสดงไฟล์ที่มีอยู่ซึ่งถูกเขียนทับโดยระบบปฏิบัติการเมื่อดึง วิธีเดียวที่จะแก้ไขปัญหานี้ก็คือการกำหนดนโยบายการตั้งชื่อบนเซิร์ฟเวอร์ Git (hooks) หรือดักจับข้อผิดพลาดล่วงหน้า
ingyhere

97

Git จะไม่รีเซ็ตไฟล์ที่ไม่ได้อยู่ในที่เก็บ คุณสามารถ:

$ git add .
$ git reset --hard

ขั้นตอนนี้จะทำการเปลี่ยนแปลงทั้งหมดซึ่งจะทำให้ Git ตระหนักถึงไฟล์เหล่านั้นและทำการรีเซ็ต

หากวิธีนี้ใช้ไม่ได้ผลคุณสามารถลองซ่อนและวางการเปลี่ยนแปลงของคุณ:

$ git stash
$ git stash drop

4
ไฟล์ถูกติดตามแล้ว พยายามอยู่ดีและมันก็ไม่ทำงานเหมือนกัน ต้องมีบางอย่างผิดปกติกับ repo ของฉัน แต่ฉันไม่มีเงื่อนงำอะไร สำหรับสิ่งที่ซ่อนคอมไพล์ดูคำตอบของฉันไป Shahbaz
Norswap

จะเกิดอะไรขึ้นเมื่อคุณมีสถานะเป็นคอมไพล์
YuriAlbuquerque

1
ฉันคิดถึงวิธีแก้ปัญหา ทำการคอมมิทและรีบูตแบบโต้ตอบเพื่อลบการคอมมิท
YuriAlbuquerque

ฉันพยายามที่จุดหนึ่งและมันทำงานได้ยากฉันภายหลังลองอีกครั้งและเกิดขึ้นกับผลลัพธ์ที่น่าประหลาดใจที่ระบุไว้ในการแก้ไขคำตอบของฉัน
Norswap

@YuriAlbuquerque, Git ไม่ได้ค่อนข้างเข้าใจPOLA ไม่ใช่จุดรวมของgit reset --hard"การรีเซ็ตทั้งพื้นที่การจัดเตรียมและไดเรกทอรีทำงานให้ตรงกัน " หรือไม่ reset --hardถ้าแฟ้มไม่ได้ฉากที่เห็นได้ชัดว่าเราต้องการที่จะเอามันออกไปเมื่อเราทำ
Pacerier

71

หากคุณใช้ Git สำหรับ Windows นี่น่าจะเป็นปัญหาของคุณ

ฉันมีปัญหาเดียวกันและที่เก็บถาวรฮาร์ดรีเซ็ตสะอาดหรือแม้กระทั่งพวกเขาทั้งหมดยังคงทิ้งการเปลี่ยนแปลง สิ่งที่กลายเป็นปัญหาคือโหมดไฟล์ x ที่ไม่ได้ตั้งอย่างถูกต้องโดย git นี่คือ "ปัญหาที่ทราบ" กับ git สำหรับ windows การเปลี่ยนแปลงในเครื่องจะแสดงในสถานะ gitk และ git เป็นโหมดเก่า 100755 โหมดใหม่ 100644 โดยไม่มีความแตกต่างของไฟล์จริง

การแก้ไขคือการละเว้นโหมดไฟล์:

git config core.filemode false

ข้อมูลเพิ่มเติมที่นี่


2
สิ่งนี้ทำงานได้แม้ว่าจะrm -rf *; git checkout HEAD .ไม่ได้ วุ้ย
forumulator

ใช้งานได้สำหรับฉันในขณะที่ stash drop / hard reset / rm .atti
kakyo

นอกจากนี้ยังใช้งานได้สำหรับฉันเมื่อฉันมีปัญหาในการทำงานกับ git repo ใน Linux ซึ่งโฮสต์บน Mac
prmph

ใช้งานได้สำหรับฉัน - ลองทุกอย่างและใช่โหมดเก่ากับโหมดใหม่เป็นปัญหา (สังเกตว่าฉันมีหมายเลขแตกต่างกัน แต่ไฟล์เหมือนกัน)
Taehoon A Kim

ประหยัดเวลาและชีวิต
Yogesh Patil

31

โอเคฉันได้แก้ปัญหาแล้ว

ดูเหมือนว่า.gitattributesไฟล์ที่มี:

*.sln        eol=crlf
*.vcproj     eol=crlf
*.vcxproj*   eol=crlf

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

การแก้ไขของฉันคือการลบไฟล์เหล่านี้และเพื่อเพิ่มautocrlf = falseภายใต้[core]ใน.git/configใน

สิ่งนี้ไม่ได้มีค่าเท่ากับสิ่งเดียวกันกับการกำหนดค่าก่อนหน้านี้อย่างที่มันต้องการให้ทุก ๆ dev ต้องมี autocrlf = falseที่จะมี ฉันต้องการค้นหาวิธีแก้ไขที่ดีกว่า

แก้ไข:

ฉันแสดงความคิดเห็นเส้นที่ใส่ร้ายป้ายสีพวกเขาและมันทำงาน อะไรนะ ... ฉันไม่แม้แต่ ... !


1
ฉันเพิ่งมีปัญหาเดียวกันนี้เกิดขึ้นและนี่เป็นทางออกเดียวที่ทำงานได้ ในกรณีของฉันฉันเปลี่ยนจากสาขาคุณลักษณะเป็นหลักของฉันและดึงการเปลี่ยนแปลงใหม่บางอย่างจากอัปสตรีมและมันเพิ่งเริ่มเกิดขึ้นสำหรับ 2 ไฟล์ที่ถูกแก้ไข ดูเหมือนว่าไฟล์อาจถูกเปลี่ยนจาก Unix เป็น Windows end line ซึ่งอาจมีบางอย่างเกี่ยวข้องกับมัน ไม่แน่ใจว่าเป็นอย่างไรหรือทำไม
Steven Surowiec

+1 ปัญหาเดียวกันใน Windows Git autocrlf = falseแล้วมี ฉันรวมการเปลี่ยนแปลงจาก upstream svn repo ( git svn fetch/ git merge git-svn) และถูกทิ้งให้อยู่กับ 1 ไฟล์ที่ทำเครื่องหมายว่าแก้ไขแล้ว สิ่งที่แปลกคือฉันเคยมีปัญหานี้มาก่อนและสิ่งที่ฉันต้องทำคือตรวจสอบสาขาอื่น (ด้วย-fธง) แล้วเปลี่ยนกลับ ฉันทำอย่างนั้นและใช้งานได้ แต่เมื่อฉันเปลี่ยนเป็นสาขาฟีเจอร์ "การเปลี่ยนแปลง" ก็กลับมาแล้ว! การแก้ไขของคุณที่ด้านล่างของคำตอบคือทางออก ในกรณีของฉันฉันแสดงความคิดเห็น / uncommented หนึ่งบรรทัดที่ด้านบนของไฟล์. gitattributes ของฉัน:* text=auto !eol
Aaron Blenkush

1
EDIT นั้นก็ทำงานให้ฉันด้วย: คอมเม้นท์ใน.gitattributes, วิ่งgit status, ไม่ใส่เครื่องหมายในบรรทัด.gitattributes, วิ่งgit statusอีกครั้ง
Ignitor

นี่เป็นเพราะ git กำลังรีเซ็ตไฟล์เหล่านั้นจากนั้นใช้การสิ้นสุดบรรทัดที่ระบุใน.gitattributesอีกครั้ง git diffอาจแสดงที่มีชื่อเสียงของผนัง / ผนังสีแดงสีเขียวที่เป็นปกติของความแตกต่างสายที่สิ้นสุด
Dagrooms

21

สาเหตุที่เป็นไปได้ # 1 - การวางบรรทัดฐานการสิ้นสุดบรรทัด

สถานการณ์หนึ่งที่สิ่งนี้สามารถเกิดขึ้นได้คือเมื่อไฟล์ที่มีปัญหาถูกตรวจสอบลงในที่เก็บโดยไม่มีการกำหนดค่าที่ถูกต้องสำหรับการจบบรรทัด (1) ส่งผลให้ไฟล์ในที่เก็บมีการสิ้นสุดของบรรทัดที่ไม่ถูกต้อง หากต้องการยืนยันให้ตรวจสอบว่าgit diffแสดงเฉพาะการเปลี่ยนแปลงในตอนท้ายบรรทัด (อาจไม่สามารถมองเห็นได้ตามค่าเริ่มต้นให้ลองgit diff | cat -vดูการขึ้นบรรทัดใหม่ตามตัวอักษร)^Mอักษร)

ต่อจากนั้นอาจมีบางคนเพิ่ม.gitattributesหรือแก้ไขการcore.autocrlfตั้งค่าเพื่อทำให้บรรทัดสุดท้ายของบรรทัดสิ้นสุด (2) ตาม.gitattributesGit หรือการกำหนดค่าระดับโลก 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/


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

16

หากคำตอบอื่น ๆ ใช้งานไม่ได้ให้ลองเพิ่มไฟล์แล้วทำการรีเซ็ต

$ git add -A
$ git reset --hard

ในกรณีของฉันสิ่งนี้ช่วยได้เมื่อมีไฟล์ว่างมากมายที่คอมไพล์กำลังติดตาม


วิธีนี้ใช้ได้ผล ฉันเพิ่งใช้$ git add .แทน$ git add -A
Bjarne Gerhardt-Pedersen

8

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

สำหรับข้อมูลเพิ่มเติม: https://stackoverflow.com/a/2016426/67824


เพื่อค้นหาชื่อของไฟล์ดังกล่าวgit ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d
Diomidis Spinellis

5

คุณสามารถstashเก็บการเปลี่ยนแปลงของคุณจากนั้นปล่อยที่เก็บ:

git stash
git stash drop

1
นอกจากนี้คุณยังอาจจะสนใจในเรื่องนี้
Shahbaz

5

วิธีการเหล่านี้ไม่เหมาะกับฉันเลยทางออกเดียวคือให้กำจัด repo ทั้งหมดและโคลนซ้ำ ซึ่งรวมถึงการ stashing, รีเซ็ต, เพิ่มแล้วรีเซ็ต, การตั้งค่า clrf, ความไวของตัวพิมพ์เล็กและตัวน้อย


อัปเดตปรากฏว่าระบบไฟล์ที่คำนึงถึงตัวพิมพ์เล็กและใหญ่ของฉันไม่ได้ตรงตามตัวพิมพ์ใหญ่ - เล็ก หลังจากฉันแก้ไขว่าปัญหานี้แก้ไขได้โดยใช้เทคนิคที่กล่าวถึงข้างต้น
John Hunt

4

เรียกใช้คำสั่งclean :

# Remove all untracked files and directories. (`-f` is `force`, `-d` is `remove directories`)

git clean -fd

3
น่าเสียดายที่นี่ไม่ได้แก้ปัญหาที่เกี่ยวข้องกับการสิ้นสุดบรรทัด
Christopher Schneider

นี่เป็นสิ่งเดียวที่แก้ไขปัญหาของฉันไม่ว่าปัญหาของฉันคืออะไร ฉันไม่มี.gitattributesไฟล์และการสิ้นสุดบรรทัดไม่มีปัญหาเนื่องจากฉันอยู่ในกล่อง linux และ devs ทั้งหมดและเซิร์ฟเวอร์ของเราเป็น linux
ซามูเอลเนฟฟ์

4

.gitattributesตรวจสอบของคุณ

ในกรณีของฉันฉันมี*.js text eol=lfอยู่ในนั้นและตัวเลือกคอมไพล์เป็นcore.autocrlftrue

มันนำฉันไปสู่สถานการณ์เมื่อคอมไพล์แปลงไฟล์ของฉันสิ้นสุดโดยอัตโนมัติและป้องกันไม่ให้ฉันแก้ไขได้และgit reset --hard HEADไม่ทำอะไรเลย

ฉันแก้ไขด้วยการแสดงความคิดเห็น*.js text eol=lfในของฉัน.gitattributesและไม่แสดงความคิดเห็นหลังจากนั้น

ดูเหมือนว่ามันเป็นแค่เวทย์มนตร์คอมไพล์


นี่เป็นสิ่งที่สำหรับฉันแล้วการอัปเกรดโครงการของฉันแนะนำ*.bat text eol=crlfให้รู้จักกับโครงการของฉัน
Leo

1

ฉันพบปัญหาที่คล้ายกันนี้.gitattributesด้วย แต่สำหรับกรณีของฉันเกี่ยวข้องกับ LFS ของ GitHub แม้ว่าสิ่งนี้จะไม่ตรงกับสถานการณ์ของ OP แต่ฉันคิดว่าเป็นโอกาสที่จะแสดงให้เห็นว่า.gitattributesไฟล์ทำอะไรและเหตุใดจึงสามารถนำไปสู่การเปลี่ยนแปลงแบบไม่มีการจัดฉากในรูปแบบของความแตกต่าง "phantom"

ในกรณีของฉันมีไฟล์อยู่ในที่เก็บของฉันเหมือนตั้งแต่เริ่มต้น ในความมุ่งมั่นเมื่อเร็ว ๆ นี้ฉันได้เพิ่มgit-lfs trackกฎใหม่โดยใช้รูปแบบที่อยู่ในความเข้าใจย้อนหลังกว้างไปหน่อยและจบลงด้วยการจับคู่ไฟล์โบราณนี้ ฉันรู้ว่าฉันไม่ต้องการเปลี่ยนไฟล์นี้; ฉันรู้ว่าฉันไม่ได้เปลี่ยนไฟล์ แต่ตอนนี้มันอยู่ในการเปลี่ยนแปลงแบบไม่สเตจของฉันและจำนวนเงินที่จ่ายในการเช็คเอาต์หรือรีเซ็ตยากในไฟล์นั้นไม่สามารถแก้ไขได้ ทำไม?

ส่วนขยาย GitHub LFS ทำงานเป็นหลักผ่านการใช้ประโยชน์จากตะขอที่gitให้การเข้าถึงผ่านทาง.gitattributesไฟล์ โดยทั่วไปรายการใน.gitattributesระบุวิธีการจับคู่ไฟล์ควรประมวลผล ในกรณีของ OP มันเกี่ยวข้องกับการสิ้นสุดบรรทัดปกติ ในของฉันมันเป็นไปได้หรือไม่ที่จะให้ LFS จัดการกับที่เก็บไฟล์ ในทั้งสองกรณีไฟล์จริงที่gitเห็นเมื่อคำนวณ a git diffไม่ตรงกับไฟล์ที่คุณเห็นเมื่อคุณตรวจสอบไฟล์ ดังนั้นหากคุณเปลี่ยนวิธีการประมวลผลไฟล์ผ่าน.gitattributesรูปแบบที่ตรงกับมันจะปรากฏเป็นการเปลี่ยนแปลงที่ไม่คงที่ในรายงานสถานะแม้ว่าจะไม่มีการเปลี่ยนแปลงในไฟล์จริงๆ

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

อ้างอิง

  1. ข้อมูลจำเพาะของ GitHub LFS - คำอธิบายที่ยอดเยี่ยมเกี่ยวกับวิธีการเชื่อมต่อเข้ากับcleanและsmudgeการเรียกใช้ฟังก์ชันเพื่อแทนที่ไฟล์ของคุณในgitวัตถุด้วยไฟล์ข้อความธรรมดาที่มีแฮช

  2. gitattributes เอกสาร - รายละเอียดทั้งหมดเกี่ยวกับสิ่งที่มีอยู่เพื่อกำหนดวิธีการgitประมวลผลเอกสารของคุณ


0

ผมมีปัญหาเหมือนกัน. ฉันทำgit reset --hard HEADแต่ยังทุกครั้งที่ฉันทำgit statusฉันเห็นไฟล์บางไฟล์ที่ถูกแก้ไข

ทางออกของฉันค่อนข้างง่าย ฉันเพิ่งปิด IDE ของฉัน (นี่คือ Xcode) และปิดบรรทัดคำสั่งของฉัน (นี่คือเทอร์มินัลใน Mac OS ของฉัน) และลองอีกครั้งและใช้งานได้

แต่ฉันก็ไม่สามารถที่จะค้นหาสิ่งที่เกิดจากปัญหา


0

ฉันเชื่อว่ามีปัญหาเกี่ยวกับ git สำหรับ Windows ที่ git สุ่มเขียนบรรทัดที่ไม่ถูกต้องในการชำระเงินและวิธีแก้ปัญหาเพียงอย่างเดียวคือชำระเงินสาขาอื่นและบังคับให้ git เพิกเฉยต่อการเปลี่ยนแปลง จากนั้นชำระเงินที่สาขาที่คุณต้องการทำงานจริง

git checkout master -f
git checkout <your branch>

โปรดทราบว่าการดำเนินการนี้จะยกเลิกการเปลี่ยนแปลงใด ๆ ที่คุณอาจทำโดยเจตนาดังนั้นให้ทำเช่นนี้ต่อเมื่อคุณมีปัญหานี้ทันทีหลังจากเช็คเอาต์

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

ฉันอัพเดตเป็น git ล่าสุดสำหรับ Windows และหวังว่าปัญหาจะหายไป


0

ปัญหาที่คล้ายกันแม้ว่าฉันจะแน่ใจได้เฉพาะบนพื้นผิว อย่างไรก็ตามมันอาจช่วยใครซักคน: สิ่งที่ฉันทำ (FWIW ใน SourceTree): stashed ไฟล์ที่ไม่มีข้อผูกมัดแล้วทำการฮาร์ดรีเซ็ต


0

เช่นเดียวกับคำตอบอื่น ๆ ที่ชี้ให้เห็นปัญหาคือเนื่องจากการแก้ไขอัตโนมัติในตอนท้ายบรรทัด ฉันพบปัญหานี้กับไฟล์ * .svg ฉันใช้ไฟล์ svg สำหรับไอคอนในโครงการของฉัน

ในการแก้ปัญหานี้ฉันขอให้ git รู้ว่าไฟล์ svg ควรได้รับการปฏิบัติเป็นไบนารีแทนที่จะเป็นข้อความโดยเพิ่มบรรทัดด้านล่างลงใน. gitattributes

* .svg ไบนารี


0

ในสถานการณ์ที่คล้ายคลึงกัน เป็นผลมาจากความทรมานเป็นเวลาหลายปีกับโปรแกรมเมอร์หลายคนที่สามารถเข้ารหัสสิ่งที่แตกต่างกันของปลายบรรทัด (. asp , .js, .css ... ไม่ใช่สาระสำคัญ) เป็นไฟล์เดียว เวลาที่ผ่านมาปฏิเสธ. gitattributes การตั้งค่าสำหรับ repo ซ้ายautorclf = trueและsafecrlf = warnและ

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

The line will have its original line endings in your working directory. warning: LF will be replaced by CRLF in ...

เคล็ดลับจากการทำให้บรรทัดสุดท้ายของการทำงานใน Git เป็นปกติ? ช่วย

git add -u


0

ความเป็นไปได้อีกอย่างหนึ่งที่ฉันพบคือแพคเกจหนึ่งในที่เก็บจบลงด้วยการถอด HEAD หากไม่มีคำตอบที่นี่ช่วยได้และคุณพบข้อความสถานะ git เช่นนี้คุณอาจมีปัญหาเดียวกัน:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   path/to/package (new commits)

การเข้าไปในpath/to/packageโฟลเดอร์ a git statusควรให้ผลลัพธ์ดังต่อไปนี้:

HEAD detached at 7515f05

และคำสั่งต่อไปนี้ควรแก้ไขปัญหาที่masterสาขาในประเทศของคุณควรจะถูกแทนที่:

git checkout master

และคุณจะได้รับข้อความว่าสาขาในพื้นที่ของคุณจะมีภาระผูกพันบางอย่างอยู่ด้านหลังสาขาระยะไกล git pullและคุณควรจะออกจากป่า!


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