. gitignore หลังจากส่งมอบ


210

ฉันมีที่เก็บข้อมูลคอมไพล์โฮสต์บน Github หลังจากก่อไฟล์จำนวนมากฉันรู้ว่าฉันต้องสร้าง.gitignoreและยกเว้น.exe,.objไฟล์

อย่างไรก็ตามมันจะลบไฟล์ที่ได้รับมอบหมายเหล่านี้ออกจากพื้นที่เก็บข้อมูลโดยอัตโนมัติหรือไม่? มีวิธีการบังคับใด ๆ


6
ผู้ใช้ Google ในอนาคตอาจพบว่าสิ่งนี้มีประโยชน์มาก กระชับและตรงประเด็น: git-tower.com/learn/git/faq/ignore-tracked-files-in-git
Austin Dean

คำตอบ:


331

ไม่คุณไม่สามารถบังคับไฟล์ที่ถูกคอมมิทใน repo ที่จะถูกลบเพียงเพราะมันถูกเพิ่มเข้าไปใน .gitignore

คุณต้องgit rm --cachedลบไฟล์ที่คุณไม่ต้องการใน repo (- เก็บไว้เนื่องจากคุณอาจต้องการเก็บสำเนาในเครื่อง แต่ลบออกจาก repo) ดังนั้นหากคุณต้องการลบ exe ทั้งหมดออกจาก repo ของคุณ

git rm --cached /\*.exe

(โปรดทราบว่าเครื่องหมายดอกจัน * ถูกยกมาจากเชลล์ซึ่งจะช่วยให้คอมไพล์และไม่ใช่เชลล์ให้ขยายชื่อพา ธ ของไฟล์และไดเรกทอรีย่อย)


6
@Madhur Ahuja จริง ๆ แล้วถ้าคุณทำgit rm /\*.exeมันจะลบ exe ทั้งหมดใน repo ของคุณ
manojlds

4
สิ่งที่มีไว้สำหรับ /?
Costa

5
@Costa gitพวกเขากำลังมีดอกจันที่จะหลบหนีเพื่อป้องกันไม่ให้เปลือกจากการตีความมันเป็นมันมีไว้สำหรับ
Lambart

2
คำเตือน: ไฟล์จะถูกเก็บไว้ในเครื่องมันเป็นเรื่องจริง ... แต่ผู้ใช้รายอื่นที่เรียกใช้ a git pullจะเห็นไฟล์ของพวกเขาถูกลบ
ByScripts

42

อย่างไรก็ตามมันจะลบไฟล์ที่ได้รับมอบหมายเหล่านี้ออกจากพื้นที่เก็บข้อมูลโดยอัตโนมัติหรือไม่?

ไม่แม้แต่กับไฟล์ที่มีอยู่แล้ว.gitignoreคุณก็ยังสามารถ "ละเว้น" ไฟล์ด้วย-fแฟล็ก (บังคับ) หากไฟล์เหล่านั้นถูกผูกมัดแล้วไฟล์เหล่านั้นจะไม่ถูกลบโดยอัตโนมัติ

git rm --cached path/to/ignored.exe

หมายความว่าฉันได้ลบทีละ. exe
Madhur Ahuja

คุณอาจจะสามารถที่จะชุดนี้ แต่ผมไม่ทราบว่าวิธีการทำงานภายใต้หน้าต่าง
KingCrunch

30

หากคุณยังไม่ได้ทำการเปลี่ยนแปลง:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push

15

ฉันต้องลบ. aia และโฟลเดอร์เป้าหมายและหลังจากอ่านความคิดเห็นทั้งหมดแล้วสิ่งนี้ก็ใช้ได้กับฉัน:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

จากนั้นผลักไปที่ต้นแบบ


.ideaเป็นปัญหาของฉันฉันคิดว่ามันก็เป็นของคุณด้วย:)
Olivier Pons

5

อย่างไรก็ตามมันจะลบไฟล์ที่ได้รับมอบหมายเหล่านี้ออกจากพื้นที่เก็บข้อมูลโดยอัตโนมัติหรือไม่?

เลขที่

สูตร 'ที่ดีที่สุด' ในการทำเช่นนี้ใช้git filter-branchตามที่เขียนไว้ที่นี่:

หน้าคนสำหรับ git-filter-branch มีตัวอย่างที่ครอบคลุม

หมายเหตุคุณจะเขียนประวัติศาสตร์อีกครั้ง หากคุณเผยแพร่การแก้ไขใด ๆ ที่มีไฟล์ที่เพิ่มโดยไม่ได้ตั้งใจสิ่งนี้อาจสร้างปัญหาให้กับผู้ใช้สาขาสาธารณะเหล่านั้นได้ แจ้งให้พวกเขาทราบหรืออาจคิดว่าคุณต้องการลบไฟล์อย่างรุนแรงเพียงใด

หมายเหตุในที่ที่มีแท็กให้ใช้--tag-name-filter catตัวเลือกgit filter-branchเสมอ มันไม่เคยเจ็บปวดและจะช่วยให้คุณปวดหัวเมื่อคุณรู้ในภายหลังว่าคุณต้องการมัน


ฉันรันคำสั่งนี้มันแสดงให้เห็น Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) คำเตือน: Ref 'refs / heads / master' ไม่เปลี่ยนแปลงและไม่มีอะไรเกิดขึ้น
Madhur Ahuja

มันเป็นคำเตือนและเป็นไปได้ว่าสาขาหลักไม่ได้ (ยัง) มีการแก้ไขใด ๆ กับไฟล์ที่จะถูกลบ คุณสามารถตรวจสอบได้อย่างง่ายดายว่า หากมีปัญหาโปรดอัปเดตคำถาม PS:การใช้งาน - --allการเขียนทั้งหมด (ท้องถิ่น) สาขาในครั้งเดียว
sehe

1

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

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