ฉันมุ่งมั่นและผลักดันบางไดเรกทอรีไป GitHub หลังจากนั้นฉันเปลี่ยน.gitignore
ไฟล์เพิ่มไดเรกทอรีที่ควรละเว้น ทุกอย่างทำงานได้ดี แต่ไดเรกทอรี (ไม่สนใจตอนนี้) ยังคงอยู่ใน Github
ฉันจะลบไดเร็กทอรีนั้นออกจาก github และประวัติที่เก็บได้อย่างไร?
ฉันมุ่งมั่นและผลักดันบางไดเรกทอรีไป GitHub หลังจากนั้นฉันเปลี่ยน.gitignore
ไฟล์เพิ่มไดเรกทอรีที่ควรละเว้น ทุกอย่างทำงานได้ดี แต่ไดเรกทอรี (ไม่สนใจตอนนี้) ยังคงอยู่ใน Github
ฉันจะลบไดเร็กทอรีนั้นออกจาก github และประวัติที่เก็บได้อย่างไร?
คำตอบ:
กฎใน.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
เป็นข้อเสนอแนะจากคอมไพล์เกี่ยวกับพื้นที่เก็บข้อมูล; ไฟล์ยังคงอยู่ในไดเรกทอรีทำงาน
-r
--cached
ขอบคุณ
-r
หมายถึงเวียนเกิดจำเป็นถ้าคุณทำไดเรกทอรีทั้งหมด --cached
แทนที่พฤติกรรมปกติของคอมไพล์ของการลบพวกเขาจากไดเรกทอรีการทำงานและการแสดงละครการลบสำหรับการกระทำและทำให้คอมไพล์ทำงานเฉพาะในพื้นที่การแสดงละครพร้อมสำหรับการกระทำ มันเป็นวิธีที่คุณบอกคอมไพล์คุณต้องการเก็บสำเนาของไฟล์ไว้ในเครื่อง
git reset name_of_file
สำหรับสิ่งที่อธิบายไว้ข้างต้นในการทำงาน
ฉันทำนี่:
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
foreach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
ตามคำตอบของฉันที่นี่: วิธีการลบไดเรกทอรีจากที่เก็บ git?
ขั้นตอนในการลบไดเรกทอรี
git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master
ขั้นตอนในการข้ามโฟลเดอร์นั้นในครั้งถัดไปที่คอมมิต
ในการเพิกเฉยต่อโฟลเดอร์นั้นจากการคอมมิทครั้งต่อไปให้สร้างหนึ่งไฟล์ในรูทชื่อ. gitignore และใส่ชื่อโฟลเดอร์นั้นลงไป คุณสามารถใส่ได้มากเท่าที่คุณต้องการ
ไฟล์. gitignoreจะมีลักษณะเช่นนี้
/FolderName
คำตอบแรกของ 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 ทั้งหมดในโครงการซึ่งไม่ใช่การกระทำที่ฉันตั้งใจ
หมายเหตุ: วิธีนี้ใช้ได้กับGithub Desktop GUIเท่านั้น
โดยใช้Github Desktop GUIมันง่ายมาก
ย้ายโฟลเดอร์ไปยังตำแหน่งอื่น (เพื่อออกจากโฟลเดอร์โครงการ) ชั่วคราว
แก้ไข.gitignore
ไฟล์ของคุณและลบรายการโฟลเดอร์ซึ่งจะเป็นการลบที่เก็บข้อมูลหลักในหน้า Github
ยอมรับและซิงค์โฟลเดอร์โครงการ
ย้ายโฟลเดอร์ไปที่โฟลเดอร์โครงการอีกครั้ง
แก้ไข.gitignore
ไฟล์อีกครั้ง
นั่นคือทั้งหมดที่
คำตอบจาก 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
วิธีนี้ใช้พฤติกรรม. 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
หากคุณจำเป็นต้องลบไฟล์ที่ถูกละเว้นใหม่จากประวัติการกระทำของสาขาหรือหากคุณไม่ต้องการให้ลบไฟล์ที่ถูกเพิกเฉยใหม่จากการดึงในอนาคตให้ดูคำตอบนี้
หากคุณทำงานจาก 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
เพียงลบออกจากไดเรกทอรีการทำงานปัจจุบันและดัชนี แต่ถ้ามันเพิ่มหลายกระทำก่อนหน้านี้มันจะยังคงอยู่ในพื้นที่เก็บข้อมูล
git rm
จะลบไฟล์ออกจากการคอมมิชชันล่าสุดในอนาคต git filter-branch
ให้เราลบออกจากประวัติทั้งหมด ดูเพิ่มเติมที่: help.github.com/articles/…