ลบไฟล์ออกจากที่เก็บ Git โดยไม่ต้องลบออกจากระบบไฟล์ในเครื่อง


3044

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

git rm mylogfile.log

จะลบไฟล์ออกจากที่เก็บ แต่จะลบออกจากระบบไฟล์โลคัลด้วย

ฉันจะลบไฟล์นี้จาก repo โดยไม่ต้องลบไฟล์ในเครื่องได้อย่างไร



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

คำตอบ:


4351

จากไฟล์ man :

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

ดังนั้นสำหรับไฟล์เดียว:

git rm --cached mylogfile.log

และสำหรับไดเรกทอรีเดียว:

git rm --cached -r mydirectory

151
svn rm --keep-localพลาดได้อย่างง่ายดายเพราะมันไม่ได้เป็นตัวอธิบายว่าเป็น
มาร์ติน

114
แต่ฉันจะเก็บรักษาไฟล์บนเซิร์ฟเวอร์ระยะไกลได้อย่างไร สิ่งนี้จะเก็บไว้ในเครื่องของฉัน แต่ถ้าฉันกดและดึงจากเซิร์ฟเวอร์อื่นไฟล์จะถูกลบ ฉันได้เพิ่ม. gignignore สำหรับไฟล์นี้ แต่มันยังถูกลบออกไป
spankmaster79

6
วิธีนี้จะลบไฟล์ออกgit pullหากคุณอยู่หลังการคอมมิทgit rm
Petr Peller

9
ที่น่าสังเกตว่าหลังจากใช้คำสั่งในคำตอบที่คุณจำเป็นต้องใช้และgit commit -m "Commit message" git pushหากคุณมีการเปลี่ยนแปลงอื่น ๆ (ตรวจสอบด้วยgit status) การเปลี่ยนแปลงเหล่านั้นจะถูกดำเนินการในเวลานี้
สินใจ

9
เนื่องจากนี่เป็นคำตอบที่ยอมรับมากที่สุดและไม่ทำสิ่งที่ขอฉันจะบอกสิ่งที่ฉันทำ ฉันใช้คำสั่งgit rm --cached mylogfile.logและลบไฟล์ออกจากที่เก็บ เพื่อหลีกเลี่ยงการสูญเสียไฟล์ในระบบการผลิตฉันจะสำรองไฟล์และดึงหลังจากนี้ ไฟล์ได้รับการลบดังกล่าวก่อนและต้องคัดลอกกลับจากการสำรองข้อมูลของคุณ มันค่อนข้างเจ็บปวด แต่ฉันไม่พบทางออกที่ดีกว่าสำหรับปัญหานี้
Marcel Grolms

275

ในการลบทั้งโฟลเดอร์ออกจาก repo (เช่นไฟล์ Resharper) ให้ทำดังนี้

git rm -r --cached folderName

ฉันส่งไฟล์ตัวแก้ไขบางตัวและไม่ต้องการให้ไฟล์เหล่านั้นคงอยู่กับผู้ใช้โครงการรายอื่น


13
เพียงบันทึกเพิ่มเติมสำหรับผู้เยี่ยมชมในอนาคต: อย่าใช้ GUI เพื่อ "ซิงค์" การส่งกลับไปยัง repo ที่จะดึงไฟล์กลับลงใน repo ท้องถิ่นของคุณ คุณต้องทำGit Push repo branchเพื่อลบไฟล์ออกจากระยะไกล
RubberDuck

211

คุณยังสามารถลบไฟล์ออกจากที่เก็บตาม. gitignore ของคุณโดยไม่ต้องลบไฟล์เหล่านั้นออกจากระบบไฟล์โลคอล:

git rm --cached `git ls-files -i -X .gitignore`

หรืออีกวิธีหนึ่งบน Windows Powershell:

git rm --cached $(git ls-files -i -X .gitignore)

7
ไม่ทำงานบน Windows git ls-files -i -X ​​.gitignore ทำงานได้ แต่ฉันไม่รู้ว่าจะส่งไฟล์ไปยัง 'git rm' ได้อย่างไร คุณรู้วิธีการทำเช่นนั้น?
Erik Z

17
ใช้งานได้กับ Windows หากคุณใช้ Git Bash แทน cmd-console
Andreas Zita

17
รักสิ่งนี้. ทำงานได้ยกเว้นว่าฉันมีไฟล์บางไฟล์ที่มีช่องว่างในชื่อไฟล์ git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}"ฉันมีการปรับเปลี่ยนวิธีการแก้ปัญหาที่นี่เพื่อนี้: โปรดพิจารณาปรับเปลี่ยนหรือเพิ่มการแก้ปัญหานี้จะตอบได้ที่นี่เพราะมันเป็นเครื่องมือที่ดีที่จะมี ...
mpettis

ฉันไม่ได้ลอง แต่ควรทดสอบว่าจะลบหรือไม่เช่นไฟล์.gitkeepที่เก็บรักษาโฟลเดอร์ว่างในที่เก็บ เช่น. .gitignoreประกอบด้วยโฟลเดอร์uploadsและ repo .gitkeepถูกบังคับให้ต้องติดตาม โดยลบทั้งหมดจาก repo ภายใต้uploadsมันจะลบ.gitkeepด้วย
Vladimir Vukanac

ข้อเสนอแนะนี้ทำงานอย่างสมบูรณ์ใน powershell: git rm - แคช $ (git ls-files -i -X. gitignore)
geekandglitter

89

ตามคำตอบของฉันที่นี่: /programming/6313126/how-to-remove-a-directory-in-my-my-github-repository

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


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

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

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

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

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

/FolderName

ลบไดเรกทอรี


@gaurav ดีใจที่ได้ช่วย!
eirenaios

69

นอกจากนี้หากคุณยอมรับข้อมูลที่ละเอียดอ่อน (เช่นไฟล์ที่มีรหัสผ่าน) คุณควรลบข้อมูลทั้งหมดออกจากประวัติของที่เก็บ นี่คือคำแนะนำที่อธิบายถึงวิธีการทำเช่นนั้น: http://help.github.com/remove-sensitive-data/


13
คำตอบนี้ควรรวมคำสั่งที่จำเป็นเพื่อให้งานนี้เสร็จสมบูรณ์แทนที่จะเชื่อมโยงไปยังเว็บไซต์อื่น
Florian Lemaitre

1
ฉันจะทราบว่าฉันพบว่าใช้เครื่องมือทำความสะอาด repo git bfgง่ายขึ้นและเร็วขึ้น
Lubed Up Slug

64

โซลูชันทั่วไปเพิ่มเติม:

  1. แก้ไข.gitignoreไฟล์

    ECHO mylogfile.log >> .gitignore

  2. ลบรายการทั้งหมดออกจากดัชนี

    git rm -r -f --cached .

  3. สร้างดัชนีใหม่

    git add .

  4. สร้างความผูกพันใหม่

    git commit -m "Removed mylogfile.log"


2
สิ่งนี้จะลบไฟล์จริงหรือ
Mr_and_Mrs_D

6
จาก GitHub? NO หากคุณได้ผลักไปที่ GitHub แล้วมันจะไม่ลบออกจากเว็บไซต์ แต่จะอัปเดตที่เก็บ git ในเครื่องของคุณ
mAsT3RpEE

5
ความคิดเห็นที่คุณลบถูกกำจัดออกไปจริง ๆ แล้ว :) ปัญหาของการแก้ไขrm --cashedคือในที่สุดมันจะลบไฟล์เมื่อมีการดึง - ใช่ไหม? และนี่ไม่ใช่สิ่งที่คนต้องการเมื่อพวกเขาพูดว่า "ลบไฟล์ออกจากพื้นที่เก็บข้อมูลโดยไม่ต้องลบออกจากระบบไฟล์ในเครื่อง " ตอนนี้ทำไมการแก้ปัญหาข้างต้นที่ได้รับการยอมรับนั้นเกินกว่าฉัน - บางที OP อาจทำงานคนเดียวและไม่เคยดึง dunno ฉันเข้าใจ GitHub "เมื่อผลักเสมอมี" ปัญหา ofc
Mr_and_Mrs_D

ฉันไม่คิดว่าจะมีวิธีแก้ปัญหา 100% เว้นแต่ว่าคุณจะขอ GitHub เอง สำหรับตอนนี้ติดนี้ คัดลอกไฟล์, เพิ่มไปยัง gitignore, ทำจริง git rm -r, กระทำ, ผลักดัน, กู้คืนไฟล์ คุณจัดการเพื่อหาวิธีแก้ไขปัญหาอื่นได้หรือไม่
mAsT3RpEE

9
ปัญหาของฉันคือไม่ GitHub - มันเป็นที่ไฟล์จะจริงจะถูกลบออกจากเพื่อนร่วมงานเมื่อพวกเขาดึง ฉันไม่ต้องการให้ไฟล์ถูกลบ สิ่งนี้ทำให้ฉันมีปัญหาใหญ่ในอดีต ดังนั้นฉันสงสัยว่ามีวิธีการแก้ปัญหาที่ไม่ลบไฟล์จริงๆ ดูความคิดเห็นเกี่ยวกับคำตอบที่ได้รับการยอมรับเช่นกัน: stackoverflow.com/questions/1143796/…
Mr_and_Mrs_D

24

Git ให้คุณไม่สนใจไฟล์เหล่านั้นโดยสมมติว่าไฟล์เหล่านั้นไม่เปลี่ยนแปลง สิ่งนี้ทำได้โดยการรันgit update-index --assume-unchanged path/to/file.txtคำสั่ง เมื่อทำเครื่องหมายไฟล์ดังกล่าวแล้วคอมไพล์จะไม่สนใจการเปลี่ยนแปลงใด ๆ ในไฟล์นั้น พวกเขาจะไม่ปรากฏขึ้นเมื่อใช้สถานะ git หรือ git diff และจะไม่ถูกผูกมัด

(จากhttps://help.github.com/articles/ignoring-files )

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

หมายเหตุ: นี่ไม่ได้ตอบคำถามโดยตรง แต่ขึ้นอยู่กับคำถามการติดตามในความคิดเห็นของคำตอบอื่น ๆ


2
อืมฉันทำสิ่งนี้ แต่ฉันเห็นว่าไฟล์นั้นสามารถเขียนทับได้ถ้ามีคนอื่นทำการเปลี่ยนแปลงใน repo
AlxVallejo

17

หากคุณต้องการเพียงยกเลิกการติดตามไฟล์และไม่ลบจาก repo ในพื้นที่และระยะไกลให้ใช้คำสั่ง thhis:

git update-index --assume-unchanged  file_name_with_path

2
ในขณะที่นี่เป็นคำตอบที่ดี แต่สิ่งสำคัญคือให้สังเกตว่าไฟล์นี้ไม่ "untrack" ในแง่ที่คนทั่วไปใช้คำนั้นกับ Git โดยที่ไฟล์ที่ไม่ได้ติดตามนั้นเป็นไฟล์ที่ไม่ได้อยู่ในประวัติของที่เก็บและไม่เคยมีมาก่อน . สิ่งที่คำตอบนี้ทำคือเก็บไฟล์ไว้ในที่เก็บ แต่ป้องกันไม่ให้ Git สังเกตเห็นว่ามีการเปลี่ยนแปลงเกิดขึ้น ซึ่งมีความแตกต่างที่สำคัญบางอย่าง - ที่สำคัญที่สุดคือไฟล์ยังคงปรากฏให้ผู้อื่นเห็นและหากมีบุคคลอื่นทำการเปลี่ยนแปลงและคุณดึงไฟล์สำเนาในเครื่องของคุณสามารถเขียนทับได้โดยไม่มีการยืนยัน
Soren

8

คำตอบข้างต้นไม่ได้ผลสำหรับฉัน ฉันใช้filter-branchเพื่อลบไฟล์ที่กำหนดทั้งหมด

ลบไฟล์ออกจากที่เก็บ git ด้วย:

git filter-branch --tree-filter 'rm  file'

ลบโฟลเดอร์ออกจากที่เก็บ git ด้วย:

git filter-branch --tree-filter 'rm -rf directory'

สิ่งนี้จะลบไดเรกทอรีหรือไฟล์ออกจากการกระทำทั้งหมด

คุณสามารถระบุการส่งคำสั่งโดยใช้:

git filter-branch --tree-filter 'rm -rf directory' HEAD

หรือช่วง:

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

หากต้องการผลักทุกอย่างให้อยู่ในระยะไกลคุณสามารถทำได้:

git push origin master --force

2
สิ่งนี้รวมกับgit rm -r --cached NAMEเคล็ดลับในการลบมันออกจาก repo คอมไพล์ในพื้นที่ของคุณและป้องกันไม่ให้มีผลกับใครก็ตามที่ดึงในภายหลัง (โดยการลบประวัติไฟล์หรือไดเรกทอรีจากคอมไพล์)
notbad.jpeg

1
สิ่งนี้จะเขียนประวัติคอมไพล์และคุณจะต้องกด - บังคับหลังจากนี้เป็นขอบเขตเล็กน้อยกับคำถามที่ฉันเดา ใน repo ที่มีชื่อเสียงสาธารณะคุณไม่สามารถเปลี่ยนประวัติศาสตร์ได้อย่างนั้นเพราะทุกคนที่ลอกแบบมาแล้ว repo จะได้รับปัญหาเมื่อดึง
Guillaume Perrot

0

ละเว้นไฟล์, ลบไฟล์ออกจาก git, อัพเดต git (สำหรับการลบ)

หมายเหตุ: สิ่งนี้จะไม่จัดการกับประวัติสำหรับข้อมูลที่ละเอียดอ่อน

กระบวนการนี้ต้องใช้ความรับผิดชอบบางอย่างกับสิ่งที่เกิดขึ้นกับคอมไพล์ เมื่อเวลาผ่านไปฉันได้เรียนรู้ที่จะทำกระบวนการต่าง ๆ เช่น:

1) ละเว้นไฟล์

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

2) ลบไฟล์ออกจาก git (เท่านั้น)

  • ตอนนี้ลบไฟล์ออกจาก git (เท่านั้น) ด้วย git remove --cached some_dir/
  • ตรวจสอบว่าพวกเขายังคงอยู่ในพื้นที่ (ควร!)

3) เพิ่มและยอมรับการเปลี่ยนแปลงนั้น (ที่สำคัญคือการเปลี่ยนแปลงเพื่อ "เพิ่ม" การลบเนื้อหาแม้จะมีคำสั่ง "เพิ่ม" ที่ทำให้สับสน!)

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