Tôi đã viết lại lịch sử kho lưu trữ của mình để xóa một số tệp FLV lớn bằng cách sử dụng git filter-branch
. Tôi chủ yếu theo bài viết bài viết Github trên removing sensitive data và hướng dẫn tương tự như tìm thấy ở những nơi khác trên Internet:Tại sao các tệp lớn vẫn tồn tại trong gói của tôi, sau khi quét chúng với bộ lọc-chi nhánh?
Loại bỏ các FLV lớn:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all
Loại bỏ các refs gốc:
Xoá reflog:
git reflog expire --expire=now --all
Cắt tỉa các đối tượng không thể truy cập được:
git gc --prune=now
Aggressivly tỉa đối tượng unreachable:
git gc --aggressive --prune=now
điều dồn:
git repack -A -d
Và gitdir của tôi vẫn là 205 MB, chứa gần như hoàn toàn trong một packfile duy nhất:
$ du -h .git/objects/pack/*
284K .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx
204M .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack
Sử dụng this script, tôi có thể thấy rằng FLV Tôi đã gỡ bỏ vẫn còn được chứa trong gói:
All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
size pack SHA location
17503 17416 1be4132fa8d91e6ce5c45caaa2757b7ea87d87b0 public/video/XXX_FINAL.flv
17348 17261 b7aa83e187112a9cfaccae9206fc356798213c06 public/video/YYY_FINAL.flv
....
Nhân bản kho qua git clone --bare my-repo
sản lượng my-repo.git
cũng được 205MB trong kích thước.
Tôi có thể làm gì để loại bỏ các đối tượng này (có lẽ) không được kiểm duyệt khỏi gói và thu hẹp kho lưu trữ của tôi về kích thước nếu chúng chưa bao giờ được cam kết? Nếu họ vẫn được tham chiếu bằng cách nào đó, có cách nào để nói ở đâu không?
Cập nhật
Khi cố gắng để tái chạy git filter-branch
, tôi nhận được thông báo này:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
Tôi xác nhận rằng có không refs trong .git/refs/original
, quả thật vậy, thư mục không tồn tại chút nào. Có cách nào khác mà git lưu trữ refs, mà tôi không biết?
Nhân bản kho lưu trữ thông qua 'git clone --bare my-repo' sản lượng' my-repo.git' cũng có kích thước 205MB, do đó không; packfile và nội dung khổng lồ của nó đi kèm với bản sao. – meagar
Câu trả lời đã xóa của bạn thú vị và có thể hữu ích cho người khác - bạn có cân nhắc chỉnh sửa câu hỏi của mình để mô tả thứ tự thực của các lệnh mà bạn đã làm hay không và sau đó đưa ra câu trả lời giải thích về refs 'refs/original' đang được đóng gói? (Đó là một điểm tinh tế mà bạn có thể có refs mà chỉ tồn tại trong các tập tin gói, và không phải là một tập tin theo 'refs'.) –
@MarkLongair Tôi vẫn chơi xung quanh, cố gắng để tái tạo các kết quả từ câu trả lời của tôi đã bị xóa. Tôi đã nhân bản repo, và thấy rằng chạy 'git repack -a' * trước khi * chạy' rm -rf .git/refs/original' không ** không ** dường như ảnh hưởng đến kết quả. Nó dường như không ảnh hưởng đến nội dung của '.git/refs/original'. – meagar