คำตอบที่ยอมรับไม่ได้ "ทำให้ Git " ลืม "เกี่ยวกับไฟล์ ... " (ในอดีต) มันทำให้ git ไม่สนใจไฟล์ในปัจจุบัน / อนาคต
วิธีนี้ทำให้คอมไพล์ลืมไฟล์ที่ถูกเพิกเฉยได้อย่างสมบูรณ์ (ในอดีต / ปัจจุบัน / อนาคต) แต่จะไม่ลบสิ่งใดออกจากไดเรกทอรีการทำงาน (แม้ว่าจะถูกดึงออกจากระยะไกล)
วิธีนี้ต้องการการใช้งาน/.git/info/exclude
(ที่ต้องการ) หรือที่มีอยู่แล้ว .gitignore
ในทุกการกระทำที่มีไฟล์ที่จะถูกละเว้น / ลืม 1
วิธีการบังคับใช้ git ละเว้นพฤติกรรมหลังจากที่ข้อเท็จจริงได้อย่างมีประสิทธิภาพอีกครั้งเขียนประวัติศาสตร์และมีramifications สำคัญสำหรับสาธารณะ / สาธารณะ / ร่วมกัน repos ที่อาจถูกดึงหลังจากกระบวนการนี้ 2
คำแนะนำทั่วไป: เริ่มต้นด้วย repo ที่สะอาด - ทุกสิ่งที่ได้ทำไม่มีสิ่งใดที่ค้างอยู่ในไดเรกทอรีการทำงานหรือดัชนีและทำการสำรองข้อมูล !
นอกจากนี้ความคิดเห็น / ประวัติการแก้ไขของคำตอบนี้ ( และประวัติการแก้ไขของคำถามนี้ ) อาจมีประโยชน์ / ตรัสรู้
#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"
#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached
#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch
git commit -m "ignored index"
#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits. If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command
git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all
#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch
git ls-files --other --ignored --exclude-standard
สุดท้ายทำตามส่วนที่เหลือของคู่มือ GitHub (เริ่มต้นที่ขั้นตอนที่ 6) ซึ่งรวมถึงคำเตือนที่สำคัญ / ข้อมูลเกี่ยวกับคำสั่งดังต่อไปนี้
git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
devs อื่น ๆ ที่ดึงมาจาก repo ระยะไกลที่แก้ไขแล้วในตอนนี้ควรทำการสำรองข้อมูลแล้ว:
#fetch modified remote
git fetch --all
#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed
git reset FETCH_HEAD
เชิงอรรถ
1เนื่องจาก/.git/info/exclude
สามารถนำไปใช้กับคอมมิชชันประวัติทั้งหมดโดยใช้คำแนะนำข้างต้นอาจมีรายละเอียดเกี่ยวกับการรับ.gitignore
ไฟล์ลงในการคอมมิชชันประวัติที่ต้องการมันอยู่นอกเหนือขอบเขตของคำตอบนี้ ฉันต้องการที่เหมาะสมที่.gitignore
จะอยู่ในรากกระทำราวกับว่ามันเป็นสิ่งแรกที่ฉันทำ คนอื่นอาจจะไม่สนใจเนื่องจาก/.git/info/exclude
สามารถประสบความสำเร็จในสิ่งเดียวกันโดยไม่คำนึงถึงที่.gitignore
อยู่ในประวัติศาสตร์ของการกระทำและเห็นได้อย่างชัดเจนอีกครั้งเขียนประวัติศาสตร์เป็นมากอาจมีงอนแม้ในขณะที่ตระหนักถึงการมีเครือข่าย
FWIW วิธีการที่เป็นไปได้อาจรวมgit rebase
หรือgit filter-branch
คัดลอกข้อมูลภายนอก .gitignore
ไปยังการส่งข้อความแต่ละครั้งเช่นคำตอบของคำถามนี้
2 การบังคับใช้พฤติกรรมการละเว้น git หลังจากข้อเท็จจริงโดยการยอมรับผลลัพธ์ของgit rm --cached
คำสั่งแบบสแตนด์อโลนอาจส่งผลให้มีการลบไฟล์ที่ถูกเพิกเฉยใหม่ในการดึงในอนาคตจากแรงผลักดันจากระยะไกล การ--prune-empty
ตั้งค่าสถานะในgit filter-branch
คำสั่งต่อไปนี้หลีกเลี่ยงปัญหานี้โดยการลบดัชนี "ลบไฟล์ที่ไม่สนใจทั้งหมด" ก่อนหน้านี้กระทำโดยอัตโนมัติ การเขียนประวัติคอมไพล์ใหม่ก็มีการเปลี่ยนแปลงแฮชซึ่งจะทำให้เกิดความเสียหายในอนาคตอันใกล้จากการแชร์สาธารณะ / แชร์ / การทำงานร่วมกัน โปรดเข้าใจการแตกสาขาอย่างเต็มที่ก่อนที่จะทำเช่นนี้กับ repo คู่มือ GitHub นี้ระบุสิ่งต่อไปนี้:
บอกทำงานร่วมกันของคุณเพื่อrebase , ไม่รวมสาขาใดที่พวกเขาสร้างขึ้นจากเดิม (ปนเปื้อน) ประวัติศาสตร์พื้นที่เก็บข้อมูลของคุณ การรวมกันของคอมมิชชันอาจทำให้เกิดประวัติศาสตร์ที่มีมลทินบางส่วนหรือทั้งหมดที่คุณเพิ่งจะประสบกับปัญหาในการกวาดล้าง
โซลูชั่นทางเลือกที่ไม่ส่งผลกระทบต่อ repo ระยะไกลgit update-index --assume-unchanged </path/file>
หรือgit update-index --skip-worktree <file>
ตัวอย่างของซึ่งสามารถพบได้ที่นี่
git clean -X
ฟังดูคล้ายกัน แต่ใช้ไม่ได้ในสถานการณ์นี้ (เมื่อไฟล์ยังคงถูกติดตามโดย Git) ฉันกำลังเขียนสิ่งนี้สำหรับทุกคนที่กำลังมองหาทางออกไม่ให้ไปตามเส้นทางที่ผิด