ลบไดเรกทอรีจากที่เก็บระยะไกลหลังจากเพิ่มไปยัง. gitignore


598

ฉันมุ่งมั่นและผลักดันบางไดเรกทอรีไป GitHub หลังจากนั้นฉันเปลี่ยน.gitignoreไฟล์เพิ่มไดเรกทอรีที่ควรละเว้น ทุกอย่างทำงานได้ดี แต่ไดเรกทอรี (ไม่สนใจตอนนี้) ยังคงอยู่ใน Github

ฉันจะลบไดเร็กทอรีนั้นออกจาก github และประวัติที่เก็บได้อย่างไร?


คำตอบ:


1066

กฎใน.gitignoreไฟล์ของคุณใช้กับไฟล์ที่ไม่ได้ติดตามเท่านั้น เนื่องจากไฟล์ภายใต้ไดเรกทอรีนั้นได้รับการยืนยันแล้วในพื้นที่เก็บข้อมูลของคุณคุณจะต้องเลิกสร้างสร้างคอมมิชชันและส่งไปยัง GitHub:

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

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

นอกจากนี้โปรดทราบว่าเอาต์พุตจากgit rm -r --cached some-directoryจะเป็นดังนี้:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

rmเป็นข้อเสนอแนะจากคอมไพล์เกี่ยวกับพื้นที่เก็บข้อมูล; ไฟล์ยังคงอยู่ในไดเรกทอรีทำงาน


3
หากมีคนอื่นดึงไฟล์ที่ถูกละเว้นในตอนนี้จะถูกลบทิ้งหรือไม่ถูกแตะต้อง?
Martin Konicek

3
@Martin Konicek: หากผู้ใช้ที่ดึงการเปลี่ยนแปลงเหล่านั้นไม่มีการแก้ไขไฟล์เหล่านั้นพวกเขาจะถูกลบออก
Mark Longair

@MarkLongair อะไรและ-r --cachedขอบคุณ
Labanino

13
@Labanino: -rหมายถึงเวียนเกิดจำเป็นถ้าคุณทำไดเรกทอรีทั้งหมด --cachedแทนที่พฤติกรรมปกติของคอมไพล์ของการลบพวกเขาจากไดเรกทอรีการทำงานและการแสดงละครการลบสำหรับการกระทำและทำให้คอมไพล์ทำงานเฉพาะในพื้นที่การแสดงละครพร้อมสำหรับการกระทำ มันเป็นวิธีที่คุณบอกคอมไพล์คุณต้องการเก็บสำเนาของไฟล์ไว้ในเครื่อง
เริ่ม

2
มันใช้งานได้ดี แต่ฉันต้องทำก่อน: git reset name_of_fileสำหรับสิ่งที่อธิบายไว้ข้างต้นในการทำงาน
Edvard Haugland

248

ฉันทำนี่:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

ซึ่งจะลบไฟล์ / โฟลเดอร์ทั้งหมดที่อยู่ในระบบคอมไพล์ของคุณและคุณต้องเลือกด้วยตนเอง


ดูเหมือนว่าจะหยุดทำงานให้ฉันตอนนี้ฉัน:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master

4
ขอบคุณสิ่งนี้ช่วยฉันได้มาก! หากคุณใช้ Windows PowerShell คุณสามารถทำได้foreach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
Matthew

10
ลองใช้วิธีที่สองของคุณมันจะลบไฟล์ทั้งหมดออกจากคอมไพล์ในพื้นที่ของฉัน!
artnikpro

2
ฉันคิดว่าคุณควรจะนำทางไปยังไดเรกทอรีย่อยและทำมัน ช่วยแก้ให้ด้วยนะถ้าฉันผิด.

ดังนั้นเราเรียนรู้อะไรวันนี้เด็ก ๆ "อย่าใช้รหัสสุ่มที่คุณพบใน Stack Overflow!"
Jonathan Landrum

49

ตามคำตอบของฉันที่นี่: วิธีการลบไดเรกทอรีจากที่เก็บ git?

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


ขั้นตอนในการลบไดเรกทอรี

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

ขั้นตอนในการข้ามโฟลเดอร์นั้นในครั้งถัดไปที่คอมมิต

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

ไฟล์. gitignoreจะมีลักษณะเช่นนี้

/FolderName

ลบไดเรกทอรี


1
นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ :)
Rohit Singh

ฉันดีใจที่มันช่วย @Rohit Singh
eirenaios

9

คำตอบแรกของ Blundell ไม่ได้ผลสำหรับฉัน อย่างไรก็ตามมันแสดงให้ฉันเห็นวิธีที่ถูกต้อง ฉันทำสิ่งเดียวกันนี้:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

ฉันแนะนำให้คุณตรวจสอบไฟล์ที่จะลบก่อนโดยใช้คำสั่งด้านล่าง:

git ls-files -i --exclude-from=.gitignore

ฉันใช้ไฟล์. gitignore ที่เป็นค่าเริ่มต้นสำหรับ visual studio และฉันสังเกตเห็นว่ามันเป็นการลบโฟลเดอร์ log และ bin ทั้งหมดในโครงการซึ่งไม่ใช่การกระทำที่ฉันตั้งใจ


5

หมายเหตุ: วิธีนี้ใช้ได้กับGithub Desktop GUIเท่านั้น

โดยใช้Github Desktop GUIมันง่ายมาก

  1. ย้ายโฟลเดอร์ไปยังตำแหน่งอื่น (เพื่อออกจากโฟลเดอร์โครงการ) ชั่วคราว

  2. แก้ไข.gitignoreไฟล์ของคุณและลบรายการโฟลเดอร์ซึ่งจะเป็นการลบที่เก็บข้อมูลหลักในหน้า Github

  3. ยอมรับและซิงค์โฟลเดอร์โครงการ

  4. ย้ายโฟลเดอร์ไปที่โฟลเดอร์โครงการอีกครั้ง

  5. แก้ไข.gitignoreไฟล์อีกครั้ง

นั่นคือทั้งหมดที่


5

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

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

4

วิธีนี้ใช้พฤติกรรม. gitignore มาตรฐานและไม่จำเป็นต้องระบุไฟล์ที่ต้องละเว้นด้วยตนเอง

ไม่สามารถใช้--exclude-from=.gitignoreอีกต่อไป: / - นี่คือวิธีการอัพเดท:

คำแนะนำทั่วไป: เริ่มต้นด้วย 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

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

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


0

หากคุณทำงานจาก PowerShell ให้ลองคำสั่งต่อไปนี้เป็นคำสั่งเดียว

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

จากนั้นgit push --force --all.

เอกสารประกอบ: https://git-scm.com/docs/git-filter-branch


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

ขวา. git rmจะลบไฟล์ออกจากการคอมมิชชันล่าสุดในอนาคต git filter-branchให้เราลบออกจากประวัติทั้งหมด ดูเพิ่มเติมที่: help.github.com/articles/…
Shaun Luttin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.