วิธีลบไฟล์ที่อยู่ใน. gitignore แต่ยังอยู่ในที่เก็บ?


327

ฉันมีไฟล์บางไฟล์ในที่เก็บของฉันที่ควรละเว้นฉันเพิ่มลงใน. gitignore แต่แน่นอนพวกเขาจะไม่ถูกลบออกจากที่เก็บของฉัน

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





คำเตือน: แม้ว่าสิ่งนี้จะไม่ลบไฟล์ทางกายภาพออกจากเครื่องของคุณ แต่มันจะลบไฟล์ออกจากเครื่องนักพัฒนาซอฟต์แวร์อื่น ๆ ในการดึงคอมไพล์ครั้งต่อไป วิธีทำให้ Git "ลืม" เกี่ยวกับไฟล์ที่ถูกติดตาม แต่ขณะนี้อยู่ใน. gitignore?
Kris Roofe

@ Stevoisiak คำถามนี้ไม่เหมือนกันเพราะคำถามนี้ถามถึงไฟล์ที่ถูกละเว้นทั้งหมดและมันก็มีคำตอบที่ดีกว่าคำถามที่คล้ายกัน
Omn

คำตอบ:


438

คุณสามารถลบออกจากที่เก็บได้ด้วยตนเอง:

git rm --cached file1 file2 dir/file3

หรือถ้าคุณมีไฟล์จำนวนมาก:

git rm --cached `git ls-files -i --exclude-from=.gitignore`

แต่ดูเหมือนว่าจะไม่ทำงานใน Git Bash บน Windows มันสร้างข้อความแสดงข้อผิดพลาด การทำงานต่อไปนี้ดีกว่า:

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  

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


2
น่าเสียดายที่คำสั่ง Git Bash บน Windows ใช้ไม่ได้กับพา ธ ที่มีช่องว่าง
Nate Bundy

19
@ คัพเค้กขอบคุณ git ls-files -i -z --exclude-from=.gitignore | xargs -0 git rm --cachedดูเหมือนว่าจะทำเคล็ดลับ
เนทบันดี้

3
ฉันติดอยู่กับปัญหาเดียวกันบน windows ฉันใช้ powershell และในกรณีของฉันฉันได้รับคำสั่งที่สามโดย @ samy-dindane และเปลี่ยนเป็น foreach มันกลายเป็นสิ่งนี้git ls-files -i --exclude-from=.gitignore | %{git rm --cached $_}
digaomatias

1
"git ls-files -i --exclude-from = .gitignore" มีประโยชน์มากมันบอกฉันว่าไฟล์ใดที่ถูกแยกโดย. signore
โอเว่นเฉา

1
ฉันยินดีที่จะค้นหาคำสั่งเหล่านี้ แต่มันไม่ได้ลบไฟล์ออกจากพื้นที่เก็บข้อมูลจริงๆ เมื่อฉันลบ 2300 kB ของภาพขนาดพื้นที่เก็บข้อมูลลดลงเพียง 10 kB ดังนั้นจึงไม่สามารถใช้เพื่อทำให้ที่เก็บมีขนาดเล็กลงและเร็วขึ้นในการถ่ายโอน
Jan Potužník

343

วิธีที่ง่ายกว่าในการทำงานกับระบบปฏิบัติการใด ๆ ก็คือการทำ

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"

โดยทั่วไปคุณอ่านไฟล์ทั้งหมดยกเว้นไฟล์ใน. gitignore


1
อย่างไรผลกระทบนี้ผู้ใช้อื่นใน repo รันดึง - เท่าที่ผมอ่านมันโฟลเดอร์ที่เราไม่ต้องการที่จะติดตามอีกต่อไปจะถูกลบ ??? เราจะป้องกันสิ่งนี้ได้อย่างไร - เราต้องการยกเลิกการติดตาม
snh_nl

นี่จะทำเครื่องหมายไฟล์ทั้งหมดว่าถูกเปลี่ยนแปลงด้วยข้อความยืนยันการปลอม!
Haidar Zeineddine

3
คุณหมายถึงอะไรโดยการส่งข้อความปลอม เป็นข้อความยืนยันที่แท้จริง: P คุณสามารถเปลี่ยนข้อความได้แน่นอนขึ้นอยู่กับความต้องการของคุณ ...
gtatr

1
เพียงเพื่อความสมบูรณ์คุณต้องมีคำสั่ง git push ในตอนท้าย
Mariusz Bialobrzeski

1
อย่าทำเช่นนี้มันจะลบประวัติในไฟล์ทั้งหมด
agrath

144

เนื่องจากไฟล์ใน. gitignoreไม่ถูกติดตามคุณสามารถใช้คำสั่งgit cleanเพื่อลบไฟล์ที่ไม่อยู่ภายใต้การควบคุมเวอร์ชันซ้ำ

ใช้git clean -xdnในการดำเนินการแห้งและดูสิ่งที่จะถูกลบออก
จากนั้นใช้git clean -xdfเพื่อรันมัน

โดยทั่วไปgit clean -hหรือman git-clean(เป็นยูนิกซ์) จะให้ความช่วยเหลือแก่คุณ

โปรดระวังว่าคำสั่งนี้จะลบไฟล์ใหม่ที่ไม่อยู่ในพื้นที่จัดเตรียม

หวังว่ามันจะช่วย


6
นี่ควรเป็นคำตอบที่ยอมรับได้ ใช้งานได้จริง (คำตอบที่ได้รับการยอมรับไม่ได้ผลสำหรับฉันใน macOS) และใช้ได้ดี
Roger Oba

25
คำตอบนี้ใช้ไม่ได้ - OP บอกว่า.gitignore กำลังติดตามไฟล์อยู่
Ken Williams

20
ระวัง! การทำเช่นนี้จะเป็นการลบไฟล์ที่ไม่ได้ติดตามทั้งหมดอย่างถาวรแทนที่จะลบออกจากสาขา
Emmanuel

1
git clean -xdnเป็นแห้งซึ่งจะไม่ลบ คนต่อไปจะ
JohnZaj

17
-1: นี่เป็นคำตอบที่ทำให้เข้าใจผิดอย่างมาก - โปสเตอร์ต้นฉบับต้องการลบออกจากที่เก็บไม่ใช่ลบไฟล์ทั้งหมด ฉันใกล้ที่จะลบโหลดไฟล์แบบไดนามิกที่ IDE ของฉันต้องการแล้ว แต่ไม่จำเป็นต้องอยู่ใน repo
Auspice

4

ฉันได้แก้ปัญหาตรงไปตรงมามากโดยจัดการผลลัพธ์ของคำสั่ง. gitignore ด้วย sed:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

คำอธิบาย:

  1. พิมพ์ไฟล์. gitignore
  2. ลบความคิดเห็นทั้งหมดจากการพิมพ์
  3. ลบบรรทัดว่างทั้งหมด
  4. เพิ่ม 'git rm -r' ไปยังจุดเริ่มต้นของบรรทัด
  5. รันทุกบรรทัด

10
sedตรงไปตรงมา?
IgorGanapolsky

0

ใน linux คุณสามารถใช้ commande นี้:

สำหรับตัวอย่างฉันต้องการลบ "* .py ~" ดังนั้นคำสั่งของฉันควรเป็น ==>

find . -name "*.py~" -exec rm -f {} \;


-3

git จะไม่สนใจไฟล์ที่ตรงกับรูปแบบ. gitignore หลังจากที่คุณเพิ่มใน. gitignore

แต่ไฟล์ที่มีอยู่แล้วในที่เก็บจะยังคงอยู่

ใช้git rm files_ignored; git commit -m 'rm no use files'เพื่อลบไฟล์ที่ถูกละเว้น


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