Resync git repo ด้วยไฟล์. gitignore ใหม่


192

เป็นไปได้หรือไม่ที่จะ "รีเฟรช" ที่เก็บ git หลังจากอัพเดตไฟล์ gitignore?

ฉันเพิ่งเพิ่มการไม่สนใจ (?) ไปยัง gitignore ของฉันและต้องการที่จะลบสิ่งที่มีอยู่แล้วใน repo ที่ตรงกับไฟล์ใหม่


1
สิ่งนี้คล้ายกับstackoverflow.com/questions/1139762/gitignore-file-not-ignoringหรือไม่
VonC

อาจเป็นไปได้ว่าโซลูชันนั้นจะลบไฟล์ที่ส่งมอบแล้วซึ่งตรงกับ gitignore ใหม่หรือไม่
Christian Wattengård

100
+1 สำหรับการประดิษฐ์คำว่า "การเพิกเฉย"
Aasmund Eldhuset

3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset มันอย่างเป็นทางการ
แดเนียลสปริงเกอร์

1
@ user770: วันนี้ฉันเรียนรู้!
Aasmund Eldhuset

คำตอบ:


372

วิธีการแก้ปัญหาที่กล่าวถึงใน " ไฟล์. gitignore not ละเลย " เป็นบิตที่รุนแรง แต่ควรทำงาน:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( ให้แน่ใจว่าการกระทำครั้งแรกที่การเปลี่ยนแปลงของคุณคุณต้องการเก็บไว้เพื่อหลีกเลี่ยงเหตุการณ์ที่เกิดขึ้นใด ๆ ที่เป็นjball037 ความคิดเห็นด้านล่าง . ตัวเลือกที่จะเก็บไฟล์ของคุณแตะต้องบนดิสก์ของคุณแม้ว่า.)
--cached

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

git rm --cached `git ls-files -i --exclude-standard`

Bassimแนะนำในการแก้ไขของเขา :

ไฟล์ที่มีช่องว่างในเส้นทางของพวกเขา

ในกรณีที่คุณได้รับข้อความแสดงข้อผิดพลาดเช่นfatal: path spec '...' did not match any filesอาจมีไฟล์ที่มีช่องว่างในเส้นทางของพวกเขา

คุณสามารถลบไฟล์อื่น ๆ ด้วยตัวเลือก--ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

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

git rm --cached "<path.to.remaining.file>"

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

3
ฉันเพิ่งจะทำสิ่งนี้สูญเสียการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดทั้งหมดและเกือบจะประกาศลาออกจากงานของฉัน คำตอบที่ได้รับการยอมรับในหัวข้อนี้ช่วยชีวิตฉันไว้ด้วย: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC ขออภัยนั่นไม่ได้หมายถึงการพูดจาโผงผางหรือติด :) แต่ใช่ฉันใช้ - แคชและการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดทั้งหมดของฉันหายไปเมื่อฉันตรวจสอบไฟล์ของฉัน หวาดกลัวสักครู่ แต่ "git reset HEAD" กู้คืนไฟล์ของฉัน (แต่คราวนี้ไม่มีไฟล์ที่ฉันระบุใน. gitignore ดังนั้นโซลูชันของคุณยังใช้งานได้!)
jball037

3
@ jball037 ดี ฉันได้เพิ่มคำเตือนและแก้ไขคำตอบตามนั้น
VonC

1
ถ้าฉันเพียงแค่อ่านหนึ่งบรรทัดเพิ่มเติมก่อนที่จะทำสิ่งนี้ "(อย่าลืมทำการเปลี่ยนแปลงแรกที่คุณต้องการเก็บไว้เพื่อหลีกเลี่ยงเหตุการณ์ใด ๆ ในฐานะ jball037" #fml
Aiden Strydom

9

ฉันอาจเข้าใจผิด แต่คุณพยายามลบไฟล์ที่ถูกละเลยใหม่หรือคุณต้องการเพิกเฉยต่อการแก้ไขไฟล์เหล่านี้ใหม่หรือไม่? ในกรณีนี้สิ่งกำลังทำงาน

หากคุณต้องการลบไฟล์ที่ถูกเพิกเฉยก่อนหน้านี้ให้ยอมรับใช้

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

คำพูดเดียวที่นี่คืออะไร
IgorGanapolsky

นี่เป็นคำตอบที่ดี
Holene

นี่เป็นเหตุผลที่ง่ายมากในการลบไฟล์หลังจากฉันอัปเดต. gitignore ของฉันอย่างไรก็ตามต้องมีการอัปเดตเล็กน้อย: `` git rm - แคชgit ls-files -i –exclude-standard คอมไพล์คอมมิท - ทำความสะอาด ''
แอรอน

1

ฉันรู้ว่านี่เป็นคำถามเก่า แต่โซลูชันของ gracchus ไม่ทำงานหากชื่อไฟล์มีช่องว่าง โซลูชันของ VonC สำหรับชื่อไฟล์ที่มีช่องว่างคือการไม่ลบออกโดยใช้ประโยชน์--ignore-unmatchจากนั้นลบด้วยตนเอง แต่จะไม่ทำงานได้ดีหากมีจำนวนมาก

นี่คือทางออกที่ใช้ bash arrays เพื่อบันทึกไฟล์ทั้งหมด

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

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