2010-08-11 54 views
57

Tôi nhận thấy gần đây rằng các tệp dự án mà các trình soạn thảo văn bản của tôi sử dụng (cùng với một số thư rác khác) đã thêm kho git cho dự án. Vì chúng không thực sự là một phần của dự án, tôi muốn loại bỏ chúng, nhưng git rm không loại bỏ các phiên bản cũ khỏi kho lưu trữ, và tôi không thể tìm thấy bất kỳ thứ gì khác có vẻ đầy hứa hẹn.Làm cách nào để xóa hoàn toàn tệp khỏi kho lưu trữ git?

+3

phần trùng lặp, chắc chắn bao phủ bởi những câu hỏi trước: http://stackoverflow.com/questions/307828/git-remove-file-accidentally-added-to -the-repository http://stackoverflow.com/questions/1216733/remove-a-directory-permanently-from-git – Cascabel

Trả lời

110

Công cụ bạn muốn là git filter-branch. sử dụng của nó được mô tả here, nhưng về cơ bản:

$ git filter-branch --tree-filter 'rm -f my_file' HEAD 

sẽ loại bỏ "my_file" từ mỗi cam kết. Chú ý rằng điều này ghi đè mọi cam kết, vì vậy nếu bạn đẩy vào một kho lưu trữ từ xa, bạn phải (a) bắt buộc cập nhật, và (b) tất cả những người khác đã kéo từ bạn sẽ có các cam kết trùng lặp (kể từ khi bạn viết lại lịch sử), như được mô tả trên git rebase man page.

+15

Tôi khuyên bạn nên thêm '--prune-empty' để bất kỳ commit trống nào được tạo ra do đó sẽ bị xóa quá. – fnkr

+0

Cách này hoạt động trên một kho lưu trữ có nhiều tệp có cùng tên trong các thư mục khác nhau? Nó có xóa tất cả các tệp có cùng tên không? – CodeMonkey

+1

@CodeMonkey: Trong trường hợp đó, bạn sẽ sử dụng đường dẫn dài hơn, độc đáo. – mipadi

5

Đây là những gì git filter-branch dành cho, nhưng hãy cẩn thận rằng lịch sử repo của bạn sẽ thay đổi và băm cam kết sẽ khác sau khi ghi lại lịch sử.

Nếu bạn muốn giải phóng dung lượng, tôi khuyên bạn nên sử dụng git forget-blob, vì chỉ git filter-branch sẽ không khiến cho tệp của bạn bị quên, vì nó vẫn có thể được tham chiếu bằng điều khiển từ xa, reflog, thẻ và như vậy.

git forget-blob main.c.swp

Bạn có thể tìm thêm thông tin here

Các vấn đề liên quan