Xóa tệp từ Git repo không thành công, không thể tạo bản sao lưu mới


116

Tôi đã cố xóa một tệp khỏi repo từ xa bằng cách chạy:

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

Nhưng Git phàn nàn rằng

Không thể tạo bản sao lưu mới. Một bản sao lưu trước đó đã tồn tại trong refs / gốc /
Buộc ghi đè bản sao lưu với -f
rm: không thể xóa /.git-rewrite/backup-refs: Quyền bị từ chối
rm: không thể xóa thư mục /.git-rewrite: Thư mục không trống

Đây là sau khi tôi đã xóa thư mục .git-Rewrite trên Windows.

Làm thế nào tôi có thể loại bỏ các tập tin đó? Đó là một tệp 29Mb nằm trên repo của tôi, vì vậy tôi khá cần phải xóa tệp.

Tôi đã cố gắng xóa cam kết git rebase -i, nhưng rõ ràng vì cam kết đã chạm vào rất nhiều tệp khác nhau, Git phàn nàn về xung đột và tôi đã hủy bỏ để được an toàn.


1
Đối với các công cụ tìm kiếm: điều này cũng có thể áp dụng khi có thông báo lỗi của bạn .git-rewrite already exists, please remove it.
Drew Noakes

Câu trả lời:


218

Bạn đã thực hiện một hoạt động chi nhánh bộ lọc. Sau nhánh lọc, Git tiếp tục giới thiệu các cam kết cũ xung quanh, trong trường hợp có lỗi xảy ra.

Bạn có thể tìm thấy những người trong .git/refs/original/…. Xóa thư mục đó và tất cả các tệp trong hoặc sử dụng -fcờ để buộc Git xóa các tham chiếu cũ.

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

10
Cuối cùng đã có nó để làm việc, cảm ơn! Tôi đã thử cờ -f, nhưng vấn đề là tôi đã đặt nó ở cuối lệnh, vd. TRỤ -f. Nhìn thấy lệnh của bạn làm tôi thử đặt cờ khi bắt đầu, và nó đã hoạt động! = D
Cardin Lee JH

12
cờ tùy chọn ( -f) đi trước refs ( HEAD). giới thiệu đi cuối cùng
knittl

Tôi vẫn nhận được cùng một lỗi sau khi thêm -f VÀ xóa thư mục. Có ý kiến ​​gì không?
Yaron

1
@knittl, tôi đã không đề cập đến git add. Tôi đã nhận được lỗi tương tự như poster ban đầu ngay cả sau khi xóa .git/refs/original/thư mục và sử dụng -fcờ trong git filter-branchlệnh. Giải pháp, trong trường hợp của tôi, là xóa .git/packed-refstập tin.
Yaron

1
@knittl, tôi đã tìm cách khắc phục nhưng không tìm thấy sự cố. Về cơ bản, tôi đã thêm --ignore-unmatchvào lệnh git rmvà nó đã diễn ra suôn sẻ!
Gabrielius

21

Sử dụng lệnh này để xóa bản sao lưu gốc:

git update-ref -d refs/original/refs/heads/master

Đây là ý chính tôi đã sử dụng để lọc chi nhánh git repo của mình: https://gist.github.com/k06a/25a0214c98bc19fd6817


Đây là giải pháp phù hợp để loại bỏ các bản sao lưu! Xóa .git/refs/original/không giải quyết được vấn đề.
Erik Koopmans

Hãy chắc chắn thay đổi 'chủ nhân' thành chi nhánh bạn đang cố gắng sửa chữa .. trong trường hợp của tôi là 'phát triển'
Damian Green

git show-ref | awk '/ refs.original.refs/{print$2}'để tìm tất cả các bản sao lưu mà repo của bạn có.
Dan

4

Tôi đã có cùng một vấn đề và câu trả lời ở trên đã không khắc phục nó. Không còn thư mục .git / refs / original /. Giải pháp cho tôi là xóa tệp .git / pack-refs.


Vấn đề tương tự. Không có .git/packed-refstập tin, tuy nhiên, và không có thư mục originaltrong .git/refs. Bất kỳ ai?
XedinUn Unknown

Đã giải quyết ở đây bằng cách thêm -rcờ vào lệnh.
XedinUn Unknown

Cùng một vấn đề ở đây. Xóa các gói-ref đã giải quyết vấn đề, nhưng nó cũng phá hỏng phần còn lại của thư mục git của tôi và tôi phải khôi phục từ bản sao lưu.
Kevin Yin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.