2012-05-18 15 views
17

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?

+0

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

+0

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'.) –

+0

@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

Trả lời

7

Sau khi nhân bản một bản sao mới của kho, tôi đã có thể chạy các lệnh chính xác như trên, và đạt được kết quả mong muốn: Thư mục .git của tôi đã giảm từ 205 MB xuống còn 20 MB, và FLV lớn các tệp đã được xóa sạch khỏi tệp gói.

Nỗ lực đầu tiên cũng được thực hiện trên một bản sao mới mà tôi đã không thực hiện sửa đổi, vì vậy tôi không có một lời giải thích thỏa đáng cho lý do tại sao các tập tin FLV tiếp tục nán lại bên trong packfile.

tôi ban đầu gửi câu trả lời dưới đây, nghĩ rằng tôi đã gây ra một vấn đề bằng cách chạy git repack -a trước khi tháo .git/refs/original, gây ra refs gốc để trở thành đóng gói để khi tôi đã loại bỏ .git/refs/original không có hiệu lực thi hành; refs ban đầu của tôi vẫn sẽ được tham chiếu các tập tin FLV lớn. Điều này dường như không giữ lên, tuy nhiên. Chạy các lệnh trên trên bản sao mới được sao chép của kho lưu trữ với việc thêm git repack -a ngay sau git filter-branch dường như không ảnh hưởng đến kết quả - các tệp FLV vẫn bị xóa khỏi gói. Tôi không có lý do gì để tin rằng điều này có liên quan đến vấn đề ban đầu.


Có một số cách khác mà các cửa hàng git refs, mà tôi không biết?

. Hóa ra tôi không hoàn toàn trung thực về thứ tự các lệnh như được liệt kê ở trên. Tôi đã chạy git repack -atrước khi chạy rm -rf .git/refs/original và Git đã đóng gói các lần lấy đi (để được xác định vị trí; thử nghiệm ngay bây giờ). Khi tôi chạy rm -rf .git/refs/original, không có gì bị xóa. git gc không thể thu nhỏ gói của tôi vì tôi đã làm vẫn còn có các tham chiếu kéo dài đối với các tệp cũ do các tham chiếu được đóng gói refs/original.

+0

Liên quan đến nơi đóng gói, hãy xem '.git/packed-refs' – twalberg

+4

Bạn có thể tóm tắt các bước chính xác mà bạn đã kết thúc, theo thứ tự, trong câu trả lời? Tôi có một vấn đề tương tự và tôi muốn thử và sửa nó. –

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