สถานะ git แสดงการแก้ไข git checkout - <file> ไม่ได้ลบออก


222

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

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout -- Rhino.Etl.Core/Enumerables/CachingEnumerable.cs

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout `git ls-files -m`

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git reset --hard HEAD
HEAD is now at 6c857e7 boo libraries updated to 2.0.9.2 and rhino.dsl.dll updated.

rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")

6
ไม่แน่ใจว่าทำไมgit reset --hardไม่ทำงานที่นี่ หมายเหตุ: ควรgit checkout -- `git ls-files -m`ยกเลิกไฟล์ ( --)
VonC

2
หากคุณลบไฟล์และใช้checkout -- <file>มันควรจะทำงาน การตรวจจับการเปลี่ยนแปลงนั้นค่อนข้างพิถีพิถันในบางสถานการณ์ (ในหมู่คนอื่น ๆ ถ้าไม่ตรงกัน CRLF อยู่)
eckes


1
@ BuZZ-dEE - เป็นรายการที่ซ้ำกันและเก่ากว่าและจะมีความสำคัญกว่า แต่ในขณะที่คำถามที่คุณเชื่อมโยงนั้นเหมือนกันคำตอบที่ฉันตอบรับด้านล่างจะให้ข้อมูลมากกว่าคำตอบใด ๆ ที่นั่นและแก้ไขปัญหาของฉัน
rbellamy

ไม่ใช่วิธีการแก้ปัญหา แต่มีดสวิสสำหรับกรณีที่น่าเบื่อ: git update-index --assume-unchagedบังคับให้สถานะไฟล์ที่ไม่เปลี่ยนแปลง (แม้กระทั่งสำหรับไฟล์ที่ถูกเปลี่ยน!)
pdem

คำตอบ:


126

มีหลายปัญหาที่อาจทำให้เกิดพฤติกรรมนี้:

บรรทัดการสิ้นสุดบรรทัดฐาน

ฉันมีปัญหาเช่นนี้ด้วย มันลงมาเพื่อคอมไพล์แปลง crlf เป็น lf โดยอัตโนมัติ โดยทั่วไปจะเกิดจากการสิ้นสุดของบรรทัดแบบผสมในไฟล์เดียว ไฟล์จะได้รับการทำให้เป็นมาตรฐานในดัชนี แต่เมื่อคอมไพล์แล้ว denormalizes อีกครั้งเพื่อ diff กับไฟล์ในแผนผังการทำงานผลลัพธ์จะแตกต่างกัน

แต่ถ้าคุณต้องการแก้ไขปัญหานี้คุณควรปิดการใช้งานcore.autocrlfเปลี่ยนการสิ้นสุดบรรทัดทั้งหมดเป็น lf แล้วเปิดใช้งานอีกครั้ง หรือคุณสามารถปิดการใช้งานพร้อมกันโดยทำ:

git config --global core.autocrlf false

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

นอกจากนี้ให้พิจารณาการตั้งค่าcore.safecrlfเพื่อเตือนหากคุณต้องการให้ git เตือนคุณเมื่อมีการดำเนินการฟื้นฟูที่ไม่สามารถย้อนกลับได้

manitagesคอมไพล์พูดแบบนี้:

การแปลง CRLF มีโอกาสเล็กน้อยในการทำลายข้อมูล autocrlf = true จะแปลง CRLF เป็น LF ระหว่างการส่งและ LF เป็น CRLF ระหว่างการชำระเงิน ไฟล์ที่มีส่วนผสมของ LF และ CRLF ก่อนที่การคอมมิทจะไม่สามารถสร้างได้โดย git สำหรับไฟล์ข้อความนี่เป็นสิ่งที่ถูกต้องที่จะทำ: มันแก้ไขการจบบรรทัดเช่นที่เรามีเพียงแค่การจบบรรทัด LF ในที่เก็บ แต่สำหรับไฟล์ไบนารีที่จัดเป็นข้อความโดยไม่ตั้งใจการแปลงอาจทำให้ข้อมูลเสียหายได้

ระบบไฟล์ที่คำนึงถึงขนาดตัวพิมพ์

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

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


8
ตกลง ... งั้นก็ทำ ... ตอนนี้สถานะคอมไพล์ไม่แสดงการเปลี่ยนแปลง ฉันได้อ่านการตั้งค่า autocrlf แล้วและฉันก็ดูเหมือนจะไม่ถูกต้อง
rbellamy

1
จับดี! +1 ยังเป็นอีกอาร์กิวเมนต์สำหรับฉันที่ตั้งค่าเป็นเท็จ ( stackoverflow.com/questions/1249932/… )
VonC

หมายความว่าอะไร: "ไฟล์ที่มีส่วนผสมของ LF และ CRLF ก่อนที่การคอมมิทจะไม่สามารถสร้างได้โดย git" นี่เป็นเพราะคอมไพล์จะทำให้บรรทัดที่ลงท้ายด้วยบรรทัดฐานตามการตั้งค่า core.autocrlf เสมอหรือไม่
rbellamy

1
วิธีการแก้ปัญหามีสติมากขึ้นในการแก้ไขปัญหาความไวกรณีคือไม่ให้มีหลาย ๆ โฟลเดอร์ใน repo ของคุณที่มีชื่อแตกต่างกันโดยเฉพาะกรณี
Ohad Schneider

3
git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -dเพื่อหาชื่อของไฟล์ที่แตกต่างกันโดยกรณีตัวอักษรเท่านั้นคุณสามารถเรียกใช้ ในการแสดงทั้งชื่อตัวพิมพ์ใหญ่และตัวพิมพ์เล็กของไฟล์ดังกล่าวให้เรียกใช้git ls-tree -r --name-only HEAD | fgrep -i -f <(git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d) | sort -i
Diomidis Spinellis

220

ฉันประสบปัญหานี้บน Windows แต่ไม่ได้เตรียมที่จะพิจารณาเรื่องการใช้config --global core.autocrlf falseฉันยังไม่ได้เตรียมที่จะละทิ้งสาขาและสารพัดส่วนตัวอื่น ๆ ในร้านของฉันและเริ่มต้นด้วยการโคลนนิ่งใหม่ ฉันแค่ต้องทำให้เสร็จ ตอนนี้

สิ่งนี้ใช้ได้ผลกับฉันเนื่องจากคุณคิดว่าคุณให้ git เขียนไดเร็กตอรี่การทำงานของคุณใหม่ทั้งหมด:

git rm --cached -r .
git reset --hard

(โปรดทราบว่าการรันgit reset --hardไม่ดีพอหรือไม่ได้เป็นrmไฟล์ธรรมดาก่อนที่resetจะมีการแนะนำในความคิดเห็นของคำถามต้นฉบับ)


8
ความสำเร็จอื่นที่นี่หลังจากการเปลี่ยนแปลงcore.autocrlfไม่มีผลใด ๆ
Daniel Buckmaster

8
ก็มีปัญหานี้บน Windows core.autocrlf falseแม้จะมี คำตอบนี้ใช้ได้ผลเมื่อไม่มีอะไรอื่น
kenchilada

9
ฉันได้ลองคำแนะนำจากคำถามนี้และคำถามอื่น ๆ หลายข้อ นี่คือการแก้ไขเดียวที่ทำงานสำหรับฉัน ฉันไม่มีไฟล์คุณลักษณะและฉันเริ่มต้นด้วย core.autocrlf เป็นเท็จ
BrotherOdin

4
สิ่งนี้ไม่ได้ผลสำหรับฉัน ดังนั้นฉันทำแฟชั่นที่น่าเกลียดมากขึ้นโดยการสร้างสาขาใหม่เพียงเพื่อทำการเปลี่ยนแปลงเหล่านี้เนื่องจากพวกเขาไม่มีประโยชน์สำหรับฉันเลย [java] git checkout -b a-branch-to-commit-bad-crlf-files [/ java] [java] git commit -am "กระทำไฟล์ crlf ที่ไม่ดี" [/ java]
Mohd Farid

3
บางครั้งปัญหาเช่นนี้ทำให้ฉันคิดถึง SVN จริงๆ
Mike Godin

104

โซลูชันอื่นที่อาจใช้ได้ผลกับผู้คนเนื่องจากไม่มีตัวเลือกข้อความที่เหมาะกับฉัน:

  1. แทนที่เนื้อหาของมีเส้นเดียว:.gitattributes * binaryสิ่งนี้บอกให้ git ปฏิบัติต่อทุก ๆ ไฟล์เป็นไฟล์ไบนารี่ที่ไม่สามารถทำอะไรได้เลย
  2. ตรวจสอบข้อความว่าไฟล์ที่ละเมิดนั้นหายไป; หากคุณไม่สามารถgit checkout -- <files>กู้คืนเป็นเวอร์ชันของที่เก็บได้
  3. git checkout -- .gitattributesเพื่อเรียกคืน.gitattributesไฟล์กลับสู่สถานะเริ่มต้น
  4. ตรวจสอบว่าไฟล์ยังคงไม่ถูกทำเครื่องหมายว่ามีการเปลี่ยนแปลง

1
ฉันติดอยู่ที่ไม่สามารถย้อนกลับดึงหรือซ่อนไฟล์ในสองสามชั่วโมงที่ผ่านมา นี่คือการแก้ไขสำหรับฉัน! ขอบคุณ! (Git 1.8.3.1)
NuSkooler

3
ฉันลองหลายสิ่งหลายอย่างก่อนที่จะประสบความสำเร็จในที่สุด ขอบคุณ!
ghenghy

1
มันทำงานอย่างไร ฉันคิดว่าการคืนค่ากลับคืน.gitattributesสู่สภาพดั้งเดิมจะทำให้ปัญหาเดิมกลับมาสู่สภาพเดิม แต่ตอนนี้ปัญหาของฉันได้รับการแก้ไขแล้ว ข้อเสนอแนะอื่น ๆ ไม่ทำงานในกรณีของฉัน
jdk1.0

1
@ jdk1.0 ความเข้าใจของฉัน / เดาว่ามีวิธีการเปรียบเทียบที่แตกต่างกันสองวิธีที่เกี่ยวข้อง ข้อผิดพลาดเกิดขึ้นเมื่อคุณมีบรรทัดที่แตกต่างกันซึ่งลงท้ายบางที่และบางครั้งคอมไพล์จะข้ามมันไป เมื่อคุณถามgit statusมันจะพบว่ามันเป็นไฟล์ต่างกัน เมื่อคุณถามgit checkoutก็พบว่าพวกเขามีเนื้อหาเหมือนกัน วิธีแก้ปัญหานี้เป็นการชั่วคราวเพื่อให้คอมไพล์ละเว้นความฉลาดในการสิ้นสุดบรรทัดที่เป็นไปได้และให้แน่ใจว่าสำเนาโลคอลของคุณนั้นเป็นไบต์ต่อไบต์เหมือนกับของHEADจริง เมื่อได้รับการแก้ไขแล้วการอนุญาตให้นำความฉลาดกลับมาใช้ได้ก็โอเคเพราะจะไม่เพิ่มข้อผิดพลาดใหม่
zebediah49

3
ใช้เวลาสองสามชั่วโมงในการจัดการกับสิ่งนี้และในที่สุดโซลูชันนี้ก็ได้ผลสำหรับฉัน!
Maryam

71

สำหรับผู้ที่มีปัญหานี้ในอนาคต: การเปลี่ยนโหมดไฟล์อาจมีอาการเหมือนกัน git config core.filemode falseจะซ่อม


3
หลังจากทำเช่นนี้คุณอาจต้องทำgit checkout .
Marty Neal

2
ทำงานให้ฉันโดยไม่ต้องเช็คเอ้าท์อีกครั้ง
phillee

3
สำหรับการอ้างอิงในอนาคตที่จะรู้ว่านี่คือการแก้ไขที่คุณต้องการ (และไม่ได้รับการแก้ไขอื่น ๆ ในคำตอบอื่น ๆ ), การใช้งานและมันจะแสดงไฟล์ที่มีการเปลี่ยนแปลงโหมดเช่นนี้git diff old mode 100755 / new mode 100644
pgr

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

ขอบคุณคุณช่วยฉันน้ำตามากมาย!
Lukasz

33

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

แหล่งที่มาของปัญหา: การติดตั้ง git ครั้งแรกของฉันคือไม่มีการแปลงบรรทัดอัตโนมัติบน windows สิ่งนี้ทำให้ฉันยอมรับ GLFW เป็นครั้งแรกโดยไม่ต้องจบบรรทัดที่เหมาะสม

หมายเหตุ: นี่เป็นวิธีแก้ปัญหาเฉพาะที่ ชายคนต่อไปที่โคลน repo จะยังคงติดอยู่กับปัญหานี้ วิธีการแก้ปัญหาอย่างถาวรสามารถพบได้ที่นี่: https://help.github.com/articles/dealing-with-line-endings/#re-normalizing-a-repository

ติดตั้ง: repub Xubuntu 12.04 Git กับโครงการ glfw

ปัญหา: ไม่สามารถรีเซ็ตไฟล์ glfw ได้ พวกเขาแสดงว่าถูกดัดแปลงเสมอโดยไม่คำนึงถึงสิ่งที่ฉันพยายาม

การแก้ไข:

edit .gitattributes

Comment out the line:    # text=auto

Save the file

restore .gitattributes:   git checkout .gitattributes

การพูดถึงเนื้อหาของบรรทัดที่มีความคิดเห็นอาจเป็นประโยชน์
rbellamy

น่าเสียดายที่โครงการส่วนใหญ่ไม่มีไฟล์. gitattribute ที่เป็นตัวเลือกนี้
mchiasson

ขอบคุณ. ฉันไม่เข้าใจว่าทำไมสิ่งนี้จึงจำเป็น
diogovk

ทำไม? โดยทั่วไปนี่เป็นการแก้ไขชั่วคราวสำหรับการสิ้นสุดบรรทัด ใช้โซลูชันถาวรโดยไปที่ลิงก์ในหมายเหตุ
Richard Lalancette

11

ฉันมีไฟล์. bat ที่มีปัญหาเดียวกัน (ไม่สามารถกำจัดได้ในไฟล์ที่ไม่ได้ติดตาม) ชำระเงิน git - ไม่ทำงานไม่มีคำแนะนำใด ๆ ในหน้านี้ สิ่งเดียวที่ทำงานให้ฉันได้คือ:

git stash save --keep-index

จากนั้นเพื่อลบที่เก็บ:

git stash drop

สิ่งนี้ใช้ได้สำหรับฉัน ทราบว่า--keep-indexเป็นสิ่งสำคัญ
user991710

ทำไม --keep-index สำคัญ?
Choylton B. Higginbottom

8

มีปัญหาเดียวกันสองครั้ง! ทั้งสองครั้งเมื่อซ่อนการเปลี่ยนแปลงบางอย่างที่ฉันทำแล้วลองป๊อปอัปกลับมา ไม่สามารถแสดงการเปลี่ยนแปลงได้เนื่องจากฉันมีไฟล์จำนวนมากที่เปลี่ยนแปลง - แต่ไม่ใช่! พวกเขาเหมือนกันทุกประการ

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

git rm --cached -r .
git reset --hard

ตอนนี้ฉันได้รับไฟล์เกือบทั้งหมดในที่เก็บของฉันถูกแก้ไข

เมื่อกระจายไฟล์จะมีข้อความระบุว่าฉันได้ลบบรรทัดทั้งหมดแล้วเพิ่มอีกครั้ง

ชนิดของการรบกวน ตอนนี้ฉันจะหลีกเลี่ยงการ stashing ในอนาคต ..

ทางออกเดียวคือการโคลนที่เก็บใหม่และเริ่มต้นใหม่ (ทำครั้งสุดท้าย)


6

ลองทำ

git checkout -f

ที่ควรล้างการเปลี่ยนแปลงทั้งหมดใน repo ท้องถิ่นทำงานปัจจุบัน


ดี! สิ่งนี้ใช้ได้สำหรับฉัน ถึงแม้ว่าสำหรับกรณีที่ดื้อรั้นฉันต้องก่อนgit checkout -f <another recent branch>จากนั้นกลับไปที่สาขาของฉันด้วยgit checkout -f <branch I'm working on>
วิศวกรที่กลับรายการเมื่อ

4

ฉันสามารถแก้ไขได้โดยการลบไฟล์. gitattributes ของ repo ชั่วคราว (ซึ่งกำหนดไว้* text=autoและ*.c text)

ฉันวิ่งไปgit statusหลังจากลบแล้วการแก้ไขก็หายไป พวกเขาไม่ได้กลับมาแม้หลังจาก. gitattributes ถูกนำกลับมาใช้


สิ่งนี้ใช้ได้แม้กับ gitattributes ที่ซับซ้อนมากขึ้นเช่นตัวกรอง
Samizdis

2

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

นอกจากนี้บางโปรแกรมเช่น bash (บน linux) ต้องการให้ไฟล์. sh ถูกยกเลิก LF

เพื่อให้แน่ใจว่าสิ่งนี้เกิดขึ้นคุณสามารถใช้ gitattributes มันทำงานได้ในระดับพื้นที่เก็บข้อมูลไม่ว่าค่าของ autcrlf คืออะไร

ตัวอย่างเช่นคุณสามารถมี. gitattributes เช่นนี้: * text = auto

นอกจากนี้คุณยังสามารถเฉพาะเจาะจงมากขึ้นต่อประเภทไฟล์ / นามสกุลถ้ามันมีความสำคัญในกรณีของคุณ

จากนั้น autocrlf สามารถแปลงการสิ้นสุดบรรทัดสำหรับโปรแกรม Windows ภายในเครื่อง

ใน C # / C ++ / Java / Ruby / R แบบผสมโครงการ Windows / Linux นี้ทำงานได้ดี ยังไม่มีปัญหา


2

ฉันก็มีอาการเหมือนกัน แต่เกิดจากสิ่งต่าง ๆ

ฉันไม่สามารถ:

git checkout app.js //did nothing
git rm app.js //did nothing
rm -rf app.js //did nothing

แม้ git rm --cached app.jsจะเป็นสัญญาณว่าถูกลบและในไฟล์ที่ไม่ได้ติดตามฉันสามารถดู app.js. แต่เมื่อฉันพยายามrm -rf app.jsและดูgit statusอีกครั้งก็ยังคงแสดงให้ฉันเห็นไฟล์ใน 'untracked'

หลังจากลองกับเพื่อนร่วมงานเราพบว่ามันเกิดจาก Grunt!

เนื่องจากGruntมีการเปิดใช้งานและเนื่องจาก app.js ถูกสร้างขึ้นจากไฟล์ js อื่น ๆ สองสามรายการเราจึงพบว่าหลังจากการดำเนินการแต่ละครั้งด้วยไฟล์ js (เช่น app.js นี้) จะสร้างแอพขึ้นมาอีกครั้ง


2

ปัญหานี้อาจเกิดขึ้นเมื่อผู้สนับสนุน repo ทำงานบนเครื่อง Linux หรือ windows ที่มี Cygwin และเปลี่ยนการอนุญาตให้ใช้ไฟล์ Git รู้เพียง 755 และ 644

ตัวอย่างของปัญหานี้และวิธีตรวจสอบ:

git diff styleguide/filename

diff --git a/filename b/filename
old mode 100644
new mode 100755

เพื่อหลีกเลี่ยงปัญหานี้คุณควรตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าคอมไพล์อย่างถูกต้องโดยใช้

git config --global core.filemode false

2

มีวิธีแก้ไขปัญหามากมายที่นี่และฉันอาจจะลองทำสิ่งเหล่านี้ก่อนที่ฉันจะตัดสินใจด้วยตัวเอง ต่อไปที่นี่เป็นอีกหนึ่ง ...

ปัญหาของเราคือเราไม่มีการบังคับใช้สำหรับ endlines และที่เก็บมีการผสมผสานของ DOS / Unix ที่แย่กว่านั้นก็คือว่ามันเป็นแหล่งซื้อคืนโอเพ่นซอร์สในตำแหน่งนี้และที่เราได้แยกกัน การตัดสินใจทำโดยผู้ที่มีความเป็นเจ้าของหลักของที่เก็บ OS เพื่อเปลี่ยน endlines ทั้งหมดเป็น Unix และกระทำได้ทำที่รวมถึงการ.gitattributesบังคับใช้การสิ้นสุดบรรทัด

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

ในระหว่างการวิจัยของฉันฉันพบ - https://help.github.com/articles/dealing-with-line-endings/ - หากฉันประสบปัญหานี้อีกครั้งฉันจะเริ่มด้วยการลองทำสิ่งนี้ก่อน


นี่คือสิ่งที่ฉันทำ:

  1. ก่อนอื่นฉันต้องทำการผสานก่อนที่จะทราบว่าฉันมีปัญหานี้และต้องยกเลิก - git reset --hard HEAD( ฉันพบความขัดแย้งในการผสานฉันจะยกเลิกการรวมได้อย่างไร )

  2. ฉันเปิดไฟล์ที่เป็นปัญหาใน VIM และเปลี่ยนเป็น Unix ( :set ff=unix) เครื่องมือเช่นdos2unixสามารถใช้แทนแน่นอน

  3. มุ่งมั่น

  4. ผสานmasterใน (ต้นแบบมีการเปลี่ยนแปลง DOS-2-Unix)

    git checkout old-code-branch; git merge master

  5. แก้ไขข้อขัดแย้งและไฟล์เป็น DOS อีกครั้งดังนั้นจึงต้อง:set ff=unixอยู่ใน VIM (หมายเหตุฉันได้ติดตั้งhttps://github.com/itchyny/lightline.vimซึ่งอนุญาตให้ฉันดูรูปแบบไฟล์ที่อยู่ในสถานะ VIM)

  6. มุ่งมั่น. เรียงทั้งหมด!

2

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


2

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

คอมไพล์เพิ่ม

คอมไพล์กระทำ - m "สุ่มกระทำ"

git reset - ฮาร์ด HEAD ~ 1


2

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

$ git clean --force -d
$ git checkout -- .

อาจเป็นตัวเลือกที่ดีกว่าในบางครั้งกำลังทำ "git stash push" พร้อมข้อความเสริมเช่น:

$ git stash push -m "not sure if i will need this later"

นี่จะเป็นการล้างไฟล์ใหม่และไฟล์ที่ถูกแก้ไขทั้งหมดของคุณ แต่คุณจะต้องซ่อนไฟล์ทั้งหมดในกรณีที่คุณต้องการกู้คืนไฟล์เหล่านั้น Stash ใน GIT มีสาขาจากสาขาหนึ่งไปอีกสาขาหนึ่งดังนั้นคุณสามารถกู้คืนสาขาเหล่านั้นในสาขาอื่นได้หากคุณต้องการ

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

$ git reset --hard

หากทั้งหมดข้างต้นไม่ได้ผลสำหรับคุณโปรดอ่านด้านล่างสิ่งที่เหมาะกับฉันมาก่อน:

ฉันพบปัญหานี้สองสามครั้งก่อนหน้านี้ ฉันกำลังพัฒนาบนเครื่อง Windows 10 ที่นายจ้างของฉันให้ไว้ วันนี้พฤติกรรมคอมไพล์นี้เกิดจากฉันสร้างสาขาใหม่จากสาขา "พัฒนา" ของฉัน ด้วยเหตุผลบางอย่างหลังจากที่ฉันเปลี่ยนกลับไปเป็น "พัฒนา" สาขาไฟล์สุ่มบางไฟล์ดูเหมือนจะยังคงอยู่และปรากฏเป็น "แก้ไข" ใน "สถานะ git"

นอกจากนี้ ณ จุดนั้นฉันไม่สามารถชำระเงินสาขาอื่นดังนั้นฉันจึงติดอยู่ที่สาขา "พัฒนา" ของฉัน

นี่คือสิ่งที่ฉันทำ:

$ git log

ฉันสังเกตเห็นว่าสาขาใหม่ที่ฉันสร้างขึ้นจาก "พัฒนา" ก่อนหน้านี้ในวันนี้ได้แสดงในข้อความ "กระทำ" แรกที่ถูกอ้างอิงในตอนท้าย "HEAD -> พัฒนาต้นกำเนิด / พัฒนาต้นกำเนิด / หัว- สาขา - ฉันสร้างขึ้น -earlier วัน "

เนื่องจากฉันไม่ต้องการมันฉันจึงลบมัน:

$ git branch -d The-branch-i-created-earlier-today

ไฟล์ที่เปลี่ยนแปลงยังคงปรากฏขึ้นดังนั้นฉัน:

$ git stash

วิธีนี้แก้ไขปัญหาของฉัน:

$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean

แน่นอน$ git stash listจะแสดงการเปลี่ยนแปลงที่สะดุดและเนื่องจากฉันมีน้อยและไม่ต้องการการหยุดชะงักใด ๆ ฉันจึงทำ$ git stash clearหยุดชะงักต้องลบสถานะทั้งหมด

หมายเหตุ : ฉันไม่ได้ลองทำในสิ่งที่ใครบางคนแนะนำมาก่อนหน้านี้:

$ git rm --cached -r .
$ git reset --hard

สิ่งนี้อาจใช้ได้เช่นกันฉันจะลองอีกครั้งเมื่อเจอปัญหานี้


1

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

ตามที่ระบุโดย HankCa การทำตามคำแนะนำในhttps://help.github.com/articles/dealing-with-line-endings/เป็นวิธีที่จะไปแก้ไขปัญหา ปุ่มง่าย:

git clone git@host:repo-name
git checkout -b normalize-line-endings
git add .
git commit -m "Normalize line endings"
git push
git push -u origin normalize-line-endings

จากนั้นผสาน (หรือดึงคำขอ) สาขาไปยังเจ้าของ repo


1

ไม่มีอะไรในหน้านี้ที่ใช้งานได้ ในที่สุดก็ใช้งานได้สำหรับฉัน ไม่แสดงไฟล์ที่ไม่ได้ติดตามหรือผูกมัด

git add -A
git reset --hard

1

สำหรับฉันปัญหาคือว่า Visual Studio เปิดขึ้นเมื่อดำเนินการคำสั่ง

git checkout <file>

หลังจากปิด Visual Studio คำสั่งใช้งานได้และในที่สุดฉันก็สามารถนำงานของฉันไปใช้จากกองซ้อนได้ ดังนั้นตรวจสอบแอปพลิเคชันทั้งหมดที่สามารถเปลี่ยนแปลงรหัสของคุณได้เช่น SourceTree, SmartGit, NotePad, NotePad ++ และเครื่องมือแก้ไขอื่น ๆ


0

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

git reset --hard
git pull origin
git merge

0

ฉันแก้ไขได้โดยการแก้ไข. git / config เพิ่ม:

[branch "name_branch"]
    remote = origin
    merge = refs/heads/name_branch

จากนั้นฉันไปที่. git / refs / heads / name_branch และวาง id ของการส่งครั้งล่าสุดenter code here


0

ฉันแก้ไขมันด้วยวิธีนี้:

  1. คัดลอกเนื้อหาของรหัสที่ถูกต้องที่คุณต้องการ
  2. ลบไฟล์ที่ทำให้เกิดปัญหา (ไฟล์ที่คุณไม่สามารถเปลี่ยนกลับได้) จากดิสก์ของคุณ ตอนนี้คุณควรค้นหาไฟล์เดียวกันทั้งสองรุ่นที่ทำเครื่องหมายว่าถูกลบ
  3. ยอมรับการลบไฟล์
  4. สร้างไฟล์อีกครั้งด้วยชื่อเดียวกันและวางในรหัสที่ถูกต้องที่คุณคัดลอกในขั้นตอนที่ 1
  5. กระทำการสร้างไฟล์ใหม่

นั่นคือสิ่งที่ได้ผลสำหรับฉัน


0

ทางออกหนึ่งที่นำเสนอที่นี่ใช้งานไม่ได้ฉันพบว่าไฟล์เป็นลิงก์ไปยังอักขระพิเศษจริง ๆ :

% ls -l StoreLogo.png
lrwxrwxrwx 1 janus janus 8 Feb 21 10:37 StoreLogo.png -> ''$'\211''PNG'$'\r\n\032\n'

% git status    
Changes not staged for commit:
    modified:   StoreLogo.png

% git rm --cached -r StoreLogo.png
rm 'src/GWallet.Frontend.XF.UWP/Assets/StoreLogo.png'

% git reset StoreLogo.png         
Unstaged changes after reset:
M   src/GWallet.Frontend.XF.UWP/Assets/StoreLogo.png

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