วิธีทำให้ Git“ ลืม” เกี่ยวกับไฟล์ที่ถูกติดตาม แต่ขณะนี้อยู่ใน. gitignore?


5399

มีไฟล์ที่ถูกติดตามโดยgitแต่ตอนนี้ไฟล์อยู่ใน.gitignoreรายการ

อย่างไรก็ตามไฟล์นั้นจะปรากฏขึ้นgit statusหลังจากที่มีการแก้ไข คุณgitจะบังคับให้ลืมเรื่องนี้ได้อย่างไร?


16
git clean -Xฟังดูคล้ายกัน แต่ใช้ไม่ได้ในสถานการณ์นี้ (เมื่อไฟล์ยังคงถูกติดตามโดย Git) ฉันกำลังเขียนสิ่งนี้สำหรับทุกคนที่กำลังมองหาทางออกไม่ให้ไปตามเส้นทางที่ผิด
imz - Ivan Zakharyaschev

35
git update-index --assume-unchangedคำตอบเดียวที่แท้จริงในการนี้จะลงมาด้านล่างดู โซลูชันนี้ 1) เก็บไฟล์บนเซิร์ฟเวอร์ (ดัชนี), 2) ให้คุณแก้ไขไฟล์ได้อย่างอิสระในเครื่อง
Qwerty

8
คุณต้องใช้--skip-worktreeดูที่: stackoverflow.com/questions/13630849/…
Doppelganger

77
คำถามที่สำคัญคือ: ไฟล์ควรอยู่ในที่เก็บหรือไม่? เช่นถ้ามีคนใหม่ลอกเลียนแบบ repo พวกเขาควรได้รับไฟล์หรือไม่? ถ้าใช่แล้วถูกต้องและไฟล์จะยังคงอยู่ในพื้นที่เก็บข้อมูลและการเปลี่ยนแปลงจะไม่ถูกเพิ่มเข้ามาด้วยgit update-index --assume-unchanged <file> git addหากไม่ (เช่นเป็นไฟล์แคชไฟล์ที่สร้างขึ้น ฯลฯ ) จากนั้นgit rm --cached <file>จะลบออกจากที่เก็บ
Martin

9
@ Martin @Qwerty แฟน ๆ ควรหยุดที่จะให้คำแนะนำสำหรับการ--assume-unchangedซึ่งเป็นผลการดำเนินงานเพื่อป้องกันการคอมไพล์เพื่อตรวจสอบสถานะของไฟล์ที่ติดตามใหญ่ แต่ต้องการ--skip-worktreeซึ่งเป็นไฟล์การติดตามการแก้ไขที่ผู้ใช้ไม่ต้องการที่จะกระทำอีกต่อไป ดูstackoverflow.com/questions/13630849/…
Philippe

คำตอบ:


5699

.gitignoreจะป้องกันไม่ให้มีการเพิ่มไฟล์ที่ไม่ได้ติดตาม (โดยไม่มีadd -f) ในชุดของไฟล์ที่ติดตามโดย git อย่างไรก็ตาม git จะยังคงติดตามไฟล์ใด ๆ ที่ถูกติดตามอยู่แล้ว

หากต้องการหยุดติดตามไฟล์คุณจะต้องลบไฟล์ออกจากดัชนี สามารถทำได้ด้วยคำสั่งนี้

git rm --cached <file>

หากคุณต้องการลบทั้งโฟลเดอร์คุณจะต้องลบไฟล์ทั้งหมดในนั้นซ้ำ

git rm -r --cached <folder>

การลบไฟล์ออกจากการแก้ไขส่วนหัวจะเกิดขึ้นในการส่งครั้งต่อไป

คำเตือน: ในขณะนี้จะไม่ลบไฟล์ทางกายภาพจากท้องถิ่นของคุณก็จะลบไฟล์จากเครื่องพัฒนาอื่น ๆ git pullต่อไป


55
กระบวนการที่ workd สำหรับฉันคือ 1. ส่งการเปลี่ยนแปลงที่รอดำเนินการก่อน 2. git rm - แคช <file> และคอมมิชชันอีกครั้ง 3. เพิ่มไฟล์ลงใน. gitignore ตรวจสอบสถานะ git และยอมรับอีกครั้ง
mataal

117
การเพิ่มที่สำคัญมาก หากไฟล์ที่ถูกเพิกเฉยจะถูกแก้ไข (แต่ไม่ควรทำเช่นนี้) หลังจากแก้ไขและดำเนินการgit add .ไฟล์นั้นจะถูกเพิ่มลงในดัชนี และการกระทำต่อไปจะส่งไปยังที่เก็บ เพื่อหลีกเลี่ยงการดำเนินการนี้ทันทีหลังจากที่ mataal พูดอีกคำสั่งหนึ่ง:git update-index --assume-unchanged <path&filename>
Dao

32
วิธีการของ @AkiraYamamoto ทำงานได้ดีสำหรับฉันเช่นกัน ในกรณีของฉันฉันเก็บเอาท์พุทเนื่องจากพื้นที่เก็บข้อมูลของฉันมีไฟล์หลายพันไฟล์:git rm -r -q --cached .
Aaron Blenkush

85
นี้จะลบไฟล์บนgit pullแม้ว่า
Petr Peller

22
git rm - แคช <file> เพียงลบไฟล์ออกจากที่เก็บ git update-index - สมมติว่า - ไม่เปลี่ยนแปลง <file> ไฟล์ไม่แสดงไฟล์ในการเปลี่ยนแปลงที่ไม่ได้ทำและไม่ทำการดึงการเปลี่ยนแปลงใหม่ แต่ฉันต้องการ Git เพียงแค่ไม่รู้เนื้อหาของไฟล์ PLEEEEEASE
Igor Semin

2609

ชุดคำสั่งด้านล่างจะลบรายการทั้งหมดจากดัชนี Git (ไม่ใช่จากไดเรกทอรีการทำงานหรือ repo ในพื้นที่) จากนั้นอัปเดตดัชนี Git ขณะที่ไม่สนใจ Git PS ดัชนี = แคช

ครั้งแรก:

git rm -r --cached . 
git add .

แล้ว:

git commit -am "Remove ignored files"

หรือหนึ่งซับ:

git rm -r --cached . && git add . && git commit -am "Remove ignored files"

197
ในการเน้นความแตกต่างระหว่างคำตอบนี้กับคำตอบที่ยอมรับ: การใช้คำสั่งนี้คุณไม่จำเป็นต้องรู้จักไฟล์ที่ได้รับผลกระทบ (ลองนึกภาพ dir ชั่วคราวที่มีไฟล์สุ่มจำนวนมากที่ควรจะถูกลบออกจากดัชนี)
ลุดวิก

53
เหมือนกับคำตอบที่ยอมรับ git pullไฟล์ที่จะได้รับการลบบน
Petr Peller

73
มันจะดีถ้ามีสิ่งนี้เป็นคำสั่ง git มาตรฐาน git rmignoredสิ่งที่ชอบ
Berik

12
@gudthing -r ย่อมาจาก "recursive"
Mark

14
ด้วยวิธีนี้คุณอาจจะจบลงเพิ่มอื่น ๆ.gitignoreไฟล์ที่ไร้ประโยชน์ที่ไม่ได้อยู่ในปัจจุบัน ซึ่งอาจเป็นเรื่องยากที่จะตรวจสอบว่าขึ้นอยู่กับว่าเสียงของคุณgit statusเป็นอย่างไรหลังจากคำสั่งนี้ คำสั่งที่ลบเฉพาะไฟล์ที่ไม่สนใจเท่านั้นจะดีกว่า นั่นเป็นเหตุผลที่ฉันชอบคำตอบของ
thSoft

1122

git update-indexทำงานให้ฉันได้:

git update-index --assume-unchanged <file>

หมายเหตุ:วิธีแก้ปัญหานี้ไม่ขึ้นกับที่จริง.gitignoreเพราะ gitignore ใช้สำหรับไฟล์ที่ไม่ได้ติดตามเท่านั้น

แก้ไข:เนื่องจากคำตอบนี้ถูกโพสต์จึงมีการสร้างตัวเลือกใหม่และควรเป็นที่ต้องการ คุณควรใช้--skip-worktreeเพื่อแก้ไขไฟล์ที่ถูกติดตามซึ่งผู้ใช้ไม่ต้องการยอมรับอีกต่อไปและรักษา--assume-unchangedประสิทธิภาพเพื่อป้องกันไม่ให้ git ตรวจสอบสถานะของไฟล์ที่ถูกติดตามขนาดใหญ่ ดูhttps://stackoverflow.com/a/13631525/717372สำหรับรายละเอียดเพิ่มเติม ...

git update-index --skip-worktree <file>

173
นี่คือคำตอบที่แท้จริง น่ากลัวจริงง่ายมากไม่ก่อให้เกิดมลพิษgit statusและจริงที่ใช้งานง่ายมาก ขอบคุณ
Pablo Olmos de Aguilera C.

4
ฉันไปหาrm [...] .ทางออกที่ดีพออย่างน้อยที่สุดฉันก็จะคร่ำครวญว่ามันทำงานอย่างไร ผมพบว่าไม่มีเอกสารที่ดีในสิ่งที่update-indexและ--assume-unchangedทำ ทุกคนสามารถเพิ่มวิธีนี้เปรียบเทียบกับที่อื่นที่ฉันต้องการลบไฟล์ทั้งหมดที่จะถูกละเว้น? (หรือลิงก์ไปยังคำอธิบายที่ชัดเจน?)
Brady Trainor

25
git update-index --assume-unchanged <path> …จะทำให้เกิดการคอมไพล์ที่จะไม่สนใจการเปลี่ยนแปลงในเส้นทางที่ระบุ (s), .gitignoreโดยไม่คำนึงถึง หากคุณดึงจากระยะไกลและระยะไกลนั้นมีการเปลี่ยนแปลงเส้นทางนี้ git จะล้มเหลวในการผสานที่มีความขัดแย้งและคุณจะต้องผสานด้วยตนเอง git rm --cached <path> …จะทำให้ git หยุดการติดตามเส้นทางนั้น หากคุณไม่ได้เพิ่มเส้นทางไปยังคุณจะเห็นเส้นทางในอนาคต.gitignore git statusตัวเลือกแรกมีสัญญาณรบกวนน้อยลงในประวัติคอมมิทคอมและอนุญาตให้ทำการเปลี่ยนแปลงไฟล์ "ละเว้น" ที่จะเผยแพร่ในอนาคต
ManicDee

26
ฉันค่อนข้างสับสนว่านี่ไม่ใช่คำตอบที่ยอมรับได้ คำตอบที่ยอมรับได้ที่นี่ไม่ได้ตอบคำถามที่ถามจริง คำตอบนี้จะละเว้นการเปลี่ยนแปลงของไฟล์ที่อยู่ในที่เก็บในขณะที่ไม่ลบมันออกจากที่เก็บ
Dave Cooper

11
คำตอบนี้จะมีประโยชน์มากขึ้นหากอธิบายอย่างชัดเจนว่าคำสั่งที่ให้ไว้ทำอะไรเช่นความแตกต่างจากโซลูชันที่แนะนำอื่น ๆ
LarsH

283
git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

นี่จะใช้รายการไฟล์ที่ถูกละเว้นและลบออกจากดัชนีจากนั้นคอมมิตการเปลี่ยนแปลง


7
git ls-files --ignored --exclude-standard | xargs git rm ถ้าคุณต้องการที่จะลบออกจากไดเรกทอรีการทำงานมากเกินไปแล้วใช้เพียง ฉันเชื่อว่าคำตอบนี้ดีที่สุด! เพราะมันชัดเจนมาก Unix-way และทำสิ่งที่ต้องการในลักษณะโดยตรงโดยไม่ต้องเขียนผลข้างเคียงของคำสั่งอื่น ๆ ที่ซับซ้อนมากขึ้น
imz - Ivan Zakharyaschev

6
คำตอบที่ดี; อย่างไรก็ตามคำสั่งจะล้มเหลวหากคุณมีพา ธ ที่มีช่องว่างตรงกลางเช่น "My dir / my_ignored_file.txt"
David Hernandez

8
git ls-files - ถูกกำหนดไว้ --exclude-standard | sed 's /.*/"&"/' | xargs git rm --cached
David Hernandez

3
git rmจะบ่นถ้าls-filesไม่ตรงอะไรเลย ใช้xargs -r git rm ...เพื่อบอกxargsไม่ให้ทำงานgit rmหากไม่มีไฟล์ที่ตรงกัน
Wolfgang

10
มันจะเป็นการดีกว่าถ้าใช้ \ 0 เป็นตัวคั่น:git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached
Nils-o-mat

83

ฉันใช้คำสั่งนี้เพื่อลบไฟล์ที่ไม่ได้ติดตาม หนึ่งบรรทัด, Unix-style, เอาต์พุตสะอาด:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

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


3
สุดยอดทางออก! ทำงานอย่างสมบูรณ์แบบและรู้สึกถูกต้องมากขึ้นว่าลบไฟล์ทั้งหมดแล้วเพิ่มกลับเข้าไปใหม่
Jon Catmull

5
ฉันก็พบว่า "สะอาด" เช่นกัน มันอาจจะเป็นที่เห็นได้ชัด แต่เพียงทำงานส่วนแรกgit ls-files --ignored --exclude-standardบนของตัวเองช่วยให้คุณแรกเข้าใจ / ตรวจสอบสิ่งที่ไฟล์ใหม่ของคุณ.gitignoreเป็นไปเพื่อยกเว้น / git rmลบก่อนที่คุณจะไปข้างหน้าและดำเนินการในขั้นตอนสุดท้าย
JonBrave

โปรดทราบว่าล้มเหลวในชื่อไฟล์บางตัวละคร "น่ารังเกียจ" \nในพวกเขาเช่น ฉันได้โพสต์โซลูชันของฉันเพื่อรองรับสิ่งนี้
JonBrave

3
ข้อแม้อื่น: เมื่อดึงสิ่งนี้จะทำให้ไฟล์ถูกลบในไดเรกทอรีทำงานของผู้อื่นใช่ไหม
LarsH

พยายาม แต่ไม่ได้ผลสำหรับฉัน: sed: 1: "s/.*/": unterminated substitute in regular expressionในคำสั่งตัวกรองสาขาใน repo ที่มีช่องว่าง (ดูเหมือนว่าจะทำงานนอกสาขาตัวกรองว่า) ผมใช้git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cachedจาก@ JonBrave ของ คำตอบแทน
goofology

71

ย้ายออกกระทำแล้วย้ายกลับเข้ามาสิ่งนี้ได้ผลสำหรับฉันในอดีต อาจมีวิธี 'gittier' เพื่อให้บรรลุนี้


2
สิ่งนี้ใช้งานได้ดีหากคุณต้องการเพิกเฉยต่อไฟล์หลาย ๆ ไฟล์ที่ไม่ได้ถูกเพิกเฉยมาก่อนหน้านี้ แม้ว่าอย่างที่คุณพูดไว้อาจมีวิธีที่ดีกว่าสำหรับเรื่องนี้
Oskar Persson

นี่คือสิ่งที่ฉันทำ เพียงแค่ย้ายไฟล์ไปยังโฟลเดอร์นอก git จากนั้นทำ "git add.", "git commit" (สิ่งนี้ลบไฟล์) จากนั้นเพิ่ม gitignore อ้างอิงไฟล์ / โฟลเดอร์ยอมรับอีกครั้งเพื่อเพิ่มไฟล์ gitignore ไปยัง git จากนั้นคัดลอก / ย้ายกลับเข้าไปในโฟลเดอร์และควรละเว้น หมายเหตุ: มันจะปรากฏว่าไฟล์ถูกลบออกจาก GIT ดังนั้นอาจจะลบไฟล์เหล่านั้นออกจาก checkouts / pulls อื่น ๆ ดังที่กล่าวไว้ในวิธีแก้ไขปัญหาด้านบน แต่เนื่องจากคุณกำลังทำสำเนาไฟล์เหล่านี้ในตอนแรก เพียงแค่ให้คนอื่น ๆ ในทีมรู้ว่า ...
Del

นี่เป็นวิธีที่ง่ายที่สุดในการกำจัดโฟลเดอร์ที่มีข้อผิดพลาด
Martlark

2
ดูเหมือนจะเป็นวิธีเดียวที่ฉันเห็น มันเป็นข้อผิดพลาดครั้งใหญ่ (ไม่ใช่ 'ฟีเจอร์') ในคอมไพล์ทันทีที่คุณเพิ่มไฟล์ / โฟลเดอร์ใน. gitignore มันไม่เพียง แต่เพิกเฉยต่อไฟล์นั้นจากจุดนั้น - ตลอดไป - ทุกที่
JosephK

มันใช้งานได้หลังจากที่ฉันเพิ่มพวกเขาแล้วหลังจากความจริงเพิ่มพวกเขาใน. gitignore
hanzolo

66

หากคุณไม่สามารถgit rmติดตามไฟล์เพราะคนอื่นอาจต้องการมัน (คำเตือนแม้ว่าคุณจะ git rm --cachedมีคนอื่นที่ได้รับการเปลี่ยนแปลงนี้ไฟล์ของพวกเขาจะถูกลบในระบบไฟล์ของพวกเขา) สิ่งเหล่านี้มักเกิดขึ้นเนื่องจากการกำหนดค่าการแทนที่ไฟล์ข้อมูลรับรองการตรวจสอบสิทธิ์ ฯลฯ โปรดดูที่https://gist.github.com/1423106เพื่อดูว่าผู้คนแก้ไขปัญหาได้อย่างไร

เพื่อสรุป:

  • ให้แอปพลิเคชันของคุณมองหาไฟล์ที่ไม่สนใจ config-overide.ini และใช้ไฟล์นั้นมากกว่าไฟล์ config.ini ที่กำหนดไว้ (หรือสลับกันค้นหา ~ / .config / myapp.ini หรือ $ MYCONFIGFILE)
  • ยอมรับไฟล์ config-sample.ini และละเว้นไฟล์ config.ini มีสคริปต์หรือคัดลอกไฟล์ที่คล้ายกันตามความจำเป็นหากจำเป็น
  • ลองใช้ gitattributes clean / smudge magic เพื่อใช้และลบการเปลี่ยนแปลงสำหรับคุณเช่น smudge ไฟล์ config เป็นการชำระเงินจากสาขาอื่นและทำความสะอาดไฟล์ config เป็นเช็คเอาต์จาก HEAD นี่คือสิ่งที่ยุ่งยากฉันไม่แนะนำสำหรับผู้ใช้มือใหม่
  • เก็บไฟล์กำหนดค่าไว้ในสาขาการนำไปใช้งานโดยเฉพาะซึ่งไม่เคยรวมเข้ากับต้นแบบ เมื่อคุณต้องการปรับใช้ / คอมไพล์ / ทดสอบคุณผสานกับสาขานั้นและรับไฟล์นั้น นี่เป็นหลักวิธี smudge / clean ยกเว้นการใช้นโยบายการผสานบุคคลและโมดูลพิเศษ git
  • การต่อต้านการกล่าวซ้ำ: อย่าใช้การสันนิษฐานที่ไม่เปลี่ยนแปลงมันจะจบลงด้วยน้ำตา (เพราะการโกหกโดยตัวเองจะทำให้สิ่งเลวร้ายเกิดขึ้นเช่นการเปลี่ยนแปลงที่คุณสูญเสียไปตลอดกาล)

7
git จะไม่ลบไฟล์หากไฟล์สกปรกในเวลาที่ลบ และถ้ามันไม่สกปรกการเรียกดูไฟล์นั้นง่ายเหมือนgit checkout <oldref> -- <filename>- แต่ก็จะถูกลบออกและไม่สนใจ
amenthes

เกี่ยวกับบันทึกย่อล่าสุดของคุณ (ประมาณ--assume-unchanged): นี่อาจเป็นลัทธิการขนส่งสินค้าและควรถูกไล่ออกหรือคุณสามารถอธิบายได้ว่าทำไม (ซึ่งฉันเชื่อมั่น) และมันจะมีประโยชน์
RomainValeri

57

ใช้สิ่งนี้เมื่อ:

1. คุณต้องการยกเลิกการติดตามไฟล์จำนวนมากหรือ

2. คุณอัปเดตไฟล์ gitignore ของคุณ

ลิงค์ที่มา: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

สมมติว่าคุณได้เพิ่ม / ส่งไฟล์บางไฟล์ไปยังที่เก็บ git ของคุณแล้วจากนั้นเพิ่มไฟล์เหล่านั้นใน. gitignore ของคุณ ไฟล์เหล่านี้จะยังคงปรากฏอยู่ในดัชนีที่เก็บของคุณ บทความนี้เราจะมาดูวิธีการกำจัดพวกเขา

ขั้นตอนที่ 1: ยืนยันการเปลี่ยนแปลงทั้งหมดของคุณ

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

ขั้นตอนที่ 2: ลบทุกอย่างออกจากที่เก็บ

เพื่อล้าง repo ของคุณใช้:

git rm -r --cached .
  • rmคือคำสั่ง remove
  • -rจะอนุญาตให้ลบแบบเรียกซ้ำ
  • - แคชจะลบไฟล์ออกจากดัชนีเท่านั้น ไฟล์ของคุณจะยังอยู่ที่นั่น

rmคำสั่งสามารถให้อภัย หากคุณต้องการลองใช้งานล่วงหน้าให้เพิ่ม-nหรือ--dry-runตั้งค่าสถานะเพื่อทดสอบสิ่งต่างๆ

ขั้นตอนที่ 3: เพิ่มทุกอย่างอีกครั้ง

git add .

ขั้นตอนที่ 4: กระทำ

git commit -m ".gitignore fix"

พื้นที่เก็บข้อมูลของคุณสะอาด :)

ผลักดันการเปลี่ยนแปลงไปยังรีโมทของคุณเพื่อดูการเปลี่ยนแปลงที่มีประสิทธิภาพเช่นกัน


1
มันจะไม่ลบไฟล์ออกจากพื้นที่เก็บข้อมูลระยะไกลหรือ ถ้าฉันต้องการเก็บไฟล์ทั้งใน repo ภายในเครื่องและ repo ระยะไกล แต่ทำ git "ลืม" เกี่ยวกับพวกเขา
Avishay28

AFAIK สิ่งนี้จะไม่ลบไฟล์ออกจากประวัติเพราะเราไม่ได้ใช้คำสั่งการเปลี่ยนแปลงประวัติใด ๆ (แก้ไขฉันถ้าฉันผิด) เพียงเพิ่มการกระทำใหม่โดยการลบไฟล์ที่ไม่สนใจใน gitignore จาก git ไฟล์เหล่านั้นจะอยู่ใน ความมุ่งมั่นทางประวัติศาสตร์
Dheeraj Bhaskar

49

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

คำเตือน : การดำเนินการนี้จะลบไฟล์ออกจากประวัติทั้งหมดของคุณ

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

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


9
การดำเนินการนี้จะเปลี่ยนรหัสการส่งมอบทั้งหมดดังนั้นจึงเป็นการรวมการแยกจากสาขานอกสำเนาที่เก็บของคุณ
bdonlan

19
คำเตือน: การดำเนินการนี้จะลบไฟล์ออกจากประวัติทั้งหมดของคุณ นี่คือสิ่งที่ฉันกำลังมองหาในการลบไฟล์ที่ไม่จำเป็นและมีขนาดใหญ่อย่างสมบูรณ์ (เอาท์พุทที่ไม่ควรทำ) ที่ได้กระทำมานานแล้วในประวัติศาสตร์เวอร์ชั่น
zebediah49

48

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

(ภายใต้ Linux) ฉันต้องการใช้โพสต์ที่นี่เพื่อแนะนำls-files --ignored --exclude-standard | xargs git rm -r --cachedวิธีการ อย่างไรก็ตาม (บางส่วน) ไฟล์ที่จะลบมีบรรทัดใหม่ / LF / ฝังตัวอยู่\nในชื่อของพวกเขา ไม่มีวิธีแก้ปัญหา:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

รับมือกับสถานการณ์นี้ (รับข้อผิดพลาดเกี่ยวกับไฟล์ไม่พบ)

ดังนั้นฉันจึงเสนอ

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

วิธีนี้ใช้-zอาร์กิวเมนต์เป็นไฟล์ lsและ-0อาร์กิวเมนต์เป็นxargsเพื่อรองรับอย่างปลอดภัย / ถูกต้องสำหรับอักขระ "น่ารังเกียจ" ในชื่อไฟล์

ในหน้าคู่มือgit-ls-files (1)ระบุว่า:

เมื่อไม่ใช้ตัวเลือก -z อักขระ TAB, LF และแบ็กสแลชในชื่อพา ธ จะแสดงเป็น \ t, \ n และ \\ ตามลำดับ

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


1
สำหรับฉันนี่คือทางออกที่ดีที่สุด git add .แต่ก็มีประสิทธิภาพที่ดีขึ้นมากกว่า นอกจากนี้ยังมีการปรับปรุงที่ดีที่สุดจากความคิดเห็นบางส่วนด้านบน
Nils-o-mat

คุณสามารถเพิ่ม thSoft git commit -am "Remove ignored files"ลงในคำตอบของคุณได้หรือไม่? คำตอบของคุณรวมกันทำให้ฉันผ่านสิ่งต่าง ๆ : j
kando

git commit -aฉันไม่เข้าใจวัตถุประสงค์ของการ สำหรับผมgit rm --cachedส่งผลกระทบต่อว่าดัชนีจึงไม่จำเป็นต้องเวทีไฟล์หลังจาก ...
Jean Paul

23
  1. อัพเดท.gitignoreไฟล์ - .gitignoreเช่นเพิ่มโฟลเดอร์ที่คุณไม่ต้องการที่จะติดตามไป

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

  3. git add .- .gitignoreไฟล์ทั้งหมดจะถูกเพิ่มกลับมาในยกเว้นผู้ที่อยู่ใน


แฮททิปไปที่ @AkiraYamamoto เพื่อชี้ให้เราไปในทิศทางที่ถูกต้อง


1
วิธีการเกี่ยวกับ downvoted เนื่องจากความจริงที่ว่ามันจะไม่จริงการทำงานตามที่คุณต้องการ -r เพื่อเรียกใช้ซ้ำ RM ล่ะค่ะ :) (ใครบางคนไม่ได้คัดลอกถูกต้อง)
อรัญมัลฮอลแลนด์

1
คำเตือน: เทคนิคนี้ไม่ได้ทำให้ git เพิกเฉยต่อไฟล์ แต่จริงๆแล้วมันทำให้ git ลบไฟล์ ซึ่งหมายความว่าหากคุณใช้โซลูชันนี้ทุกครั้งที่มีคนอื่นดึง git ไฟล์จะถูกลบ ดังนั้นมันจะไม่ถูกละเว้นจริง ดูวิธีแก้ปัญหาที่แนะนำ git update-index - สมมติว่าไม่มีการเปลี่ยนแปลงแทนสำหรับคำตอบของคำถามเดิม
orrd

16

ฉันคิดว่าบางทีคอมไพล์ก็ไม่สามารถลืมไฟล์ทั้งหมดได้เนื่องจากความคิดของมัน ( ส่วน "Snapshots, Not Differences" )

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

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

บทความทั้งสองนี้มีประโยชน์สำหรับฉัน:

git สมมติว่าไม่เปลี่ยนแปลง vs skip-worktree และวิธีละเว้นการเปลี่ยนแปลงในไฟล์ที่ถูกติดตามด้วย Git

การอ้างอิงจากนั้นฉันทำสิ่งต่อไปนี้หากไฟล์ถูกติดตามอยู่แล้ว:

git update-index --skip-worktree <file>

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

git update-index --no-skip-worktree <file>
git stash
git pull 

เนื้อหาไฟล์จะถูกแทนที่ด้วยเนื้อหาระยะไกล วางการเปลี่ยนแปลงของคุณจากที่ปลอดภัยไปยังไฟล์และดำเนินการอีกครั้ง:

git update-index --skip-worktree <file>

หากทุกคนที่ทำงานกับโครงการจะทำงานgit update-index --skip-worktree <file>ได้ปัญหาpullควรหายไป โซลูชันนี้ใช้ได้สำหรับไฟล์การกำหนดค่าเมื่อนักพัฒนาซอฟต์แวร์ทุกคนมีการกำหนดค่าโครงการของตนเอง

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


16

ทำตามขั้นตอนต่อไปนี้ตามลำดับคุณจะไม่เป็นไร

1. ลบไฟล์เพิ่มผิดพลาดจากไดเรกทอรี / การจัดเก็บข้อมูล คุณสามารถใช้คำสั่ง "rm -r" (สำหรับ linux) หรือลบออกโดยเรียกดูไดเรกทอรี หรือย้ายไปยังตำแหน่งอื่นบนพีซีของคุณ [คุณอาจจำเป็นต้องปิด IDE หากใช้เพื่อย้าย / ลบ ]

2. เพิ่มไฟล์ / ไดเรกทอรีเป็นgitignoreไฟล์ทันทีและบันทึก

3. ทราบว่าลบออกจากแคช gitโดยใช้คำสั่งเหล่านี้ (หากมีมากกว่าหนึ่งไดเรกทอรีให้ลบออกทีละตัวโดยออกคำสั่งนี้ซ้ำ ๆ )

git rm -r --cached path-to-those-files

4.now ทำกระทำและการผลักดันให้ใช้คำสั่งเหล่านี้ การดำเนินการนี้จะลบไฟล์เหล่านั้นออกจาก git remoteและทำให้ git หยุดการติดตามไฟล์เหล่านั้น

git add .
git commit -m "removed unnecessary files from git"
git push origin

13

คำตอบคัดลอก / วางคือ git rm --cached -r .; git add .; git status

คำสั่งนี้จะไม่สนใจไฟล์ที่มีการคอมมิทไปที่ที่เก็บ Git แล้ว แต่ตอนนี้เราได้เพิ่มมันเข้าไป.gitignoreแล้ว


9

คำตอบจาก Matt Fear เป็น IMHO ที่มีประสิทธิภาพที่สุด ต่อไปนี้เป็นเพียงสคริปต์ PowerShell สำหรับผู้ที่อยู่ใน windows เท่านั้นที่จะลบไฟล์ออกจาก repo git ที่ตรงกับรายการยกเว้นของพวกเขา

# Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles =  gc .gitignore | ?{$_ -notmatch  "#"} |  ?{$_ -match  "\S"} | % {
                    $ignore = "*" + $_ + "*"
                    (gci -r -i $ignore).FullName
                }
$ignoreFiles = $ignoreFiles| ?{$_ -match  "\S"}

# Remove each of these file from Git 
$ignoreFiles | % { git rm $_}

git add .

รายการไฟล์นี้จะไม่เท่ากับ recursive --cached ในสถานการณ์ใด
John Zabroski

8

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


34
git rm --cachedจะลบไฟล์จากดัชนีโดยไม่ต้องลบออกจากดิสก์จึงไม่จำเป็นต้องย้าย / คัดลอกมันออกไป
bdonlan

7

การใช้git rm --cachedคำสั่งไม่ตอบคำถามเดิม:

คุณgitจะบังคับให้ลืม [ไฟล์] โดยสมบูรณ์อย่างไร

ในความเป็นจริงการแก้ปัญหานี้จะทำให้ไฟล์ถูกลบในทุก ๆ กรณีอื่น ๆ ของพื้นที่เก็บข้อมูลเมื่อรันgit pull!

วิธีที่ถูกต้องในการบังคับใช้คอมไพล์จะลืมเกี่ยวกับไฟล์เป็นเอกสารโดย GitHub ที่นี่

ฉันขอแนะนำให้อ่านเอกสาร แต่โดยทั่วไปแล้ว:

git fetch --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch full/path/to/file' --prune-empty --tag-name-filter cat -- --all
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

เพียงแทนที่full/path/to/fileด้วยเส้นทางแบบเต็มของไฟล์ .gitignoreให้แน่ใจว่าคุณได้เพิ่มไฟล์เพื่อคุณ

นอกจากนี้คุณจะต้อง (ชั่วคราว) อนุญาตให้ส่งต่อไปยังที่เก็บข้อมูลของคุณแบบไม่กรอไปข้างหน้าเนื่องจากคุณเปลี่ยนประวัติคอมไพล์


5

BFGถูกออกแบบมาเฉพาะสำหรับการลบข้อมูลที่ไม่พึงประสงค์เช่นไฟล์ขนาดใหญ่หรือรหัสผ่านจาก Repos Git จึงมีธงที่เรียบง่ายที่จะลบใด ๆ ที่มีขนาดใหญ่ในประวัติศาสตร์ (ไม่-in-หมุนเวียนกระทำ) ไฟล์: '--strip-blobs- มีขนาดใหญ่กว่า'

$ java -jar bfg.jar --strip-blobs-bigger-than 100M

หากคุณต้องการระบุไฟล์ตามชื่อคุณสามารถทำได้เช่นกัน:

$ java -jar bfg.jar --delete-files *.mp4

BFG นั้นเร็วกว่าตัวกรอง git 10-1000x และโดยทั่วไปใช้งานง่ายกว่ามาก - ตรวจสอบคำแนะนำการใช้งานและตัวอย่างสำหรับรายละเอียดเพิ่มเติม

ที่มา: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html


5

หากคุณไม่ต้องการใช้ CLI และทำงานบน Windows วิธีแก้ปัญหาที่ง่ายมากคือการใช้TortoiseGitมันมีการกระทำ "ลบ (เก็บในเครื่อง)" ในเมนูที่ใช้งานได้ดี


5

ฉันชอบคำตอบของ JonBrave แต่ฉันมีไดเรกทอรีงานที่ยุ่งพอที่จะยอมรับ -a ทำให้ฉันกลัวเล็กน้อยดังนั้นนี่คือสิ่งที่ฉันได้ทำไปแล้ว:

git config - alias.exclude-ละเว้นโกลบอล '! git ls-files -z - ลงนาม --exclude-standard | xargs -0 git rm -r - เก็บไว้ && git ls-files -z - ลงนามแล้ว - ยกเว้นมาตรฐาน | xargs -0 git stage && git stage .gitignore && git commit -m "gitignore ใหม่และลบไฟล์ที่ถูกละเว้นออกจากดัชนี" '

ทำลายมันลง:

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 
git ls-files -z --ignored --exclude-standard | xargs -0 git stage 
git stage .gitignore 
git commit -m "new gitignore and remove ignored files from index"
  • ลบไฟล์ที่ถูกละเว้นจากดัชนี
  • stage .gitignore และไฟล์ที่คุณเพิ่งลบ
  • ผูกมัด

4

นี่ไม่ใช่ปัญหาใน git ล่าสุดอีกต่อไป (v2.17.1 ในขณะที่เขียน)

.gitignoreไฟล์ในที่สุดก็ละเว้นการติดตาม แต่ลบ คุณสามารถทดสอบสิ่งนี้ได้ด้วยตัวเองโดยเรียกใช้สคริปต์ต่อไปนี้ git statusคำสั่งสุดท้ายควรรายงาน "ไม่มีอะไรให้ยอมรับ"

# Create empty repo
mkdir gitignore-test
cd gitignore-test
git init

# Create a file and commit it
echo "hello" > file
git add file
git commit -m initial

# Add the file to gitignore and commit
echo "file" > .gitignore
git add .gitignore
git commit -m gitignore

# Remove the file and commit
git rm file
git commit -m "removed file"

# Reintroduce the file and check status.
# .gitignore is now respected - status reports "nothing to commit".
echo "hello" > file
git status

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

2

ในกรณีที่มีข้อผูกพันแล้วDS_Store:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

ไม่สนใจพวกเขาโดย:

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

ในที่สุดทำการกระทำ!


2

โดยเฉพาะอย่างยิ่งสำหรับไฟล์ที่ใช้ IDE ฉันใช้สิ่งนี้:

เช่น slnx.sqlite ฉันเพิ่งกำจัดมันออกไปอย่างสมบูรณ์เช่นนี้

git rm {PATH_OF_THE_FILE}/slnx.sqlite -f
git commit -m "remove slnx.sqlite"

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


2

คำตอบที่ยอมรับไม่ได้ "ทำให้ 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>ตัวอย่างของซึ่งสามารถพบได้ที่นี่


0

หากใครที่มีเวลาลำบากบน Windows และคุณต้องการละเว้นโฟลเดอร์ทั้งหมดให้ 'cd' เพื่อต้องการ 'folder' และทำ 'Git Bash Here'

git ls-files -z | xargs -0 git update-index --assume-unchanged

0

ในกรณีของฉันที่นี่ฉันมีไฟล์ .lock หลายไฟล์ในหลายไดเรกทอรีที่ฉันต้องการลบ ฉันรันสิ่งต่อไปนี้และทำงานได้โดยไม่ต้องเข้าไปในแต่ละไดเรกทอรีเพื่อลบออก:

git rm -r --cached **/*.lock

การทำเช่นนี้ได้เข้าไปในแต่ละโฟลเดอร์ภายใต้ 'root' ของตำแหน่งที่ฉันอยู่และแยกไฟล์ทั้งหมดที่ตรงกับรูปแบบ

หวังว่านี่จะช่วยผู้อื่น!

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