Bạn có thể xóa mã nhị phân và giữ lại phần còn lại của lịch sử. Git cho phép bạn sắp xếp lại và 'xóa' các cam kết trước đó, vì vậy bạn có thể chỉ kết hợp các cam kết thêm và xóa các tệp nhị phân lớn của mình. Nếu tất cả các lần thêm được thực hiện trong một cam kết và xóa trong một cam kết khác, điều này sẽ dễ dàng hơn nhiều so với việc xử lý từng tệp.
$ git log --stat # list all commits and commit messages
Tìm kiếm điều này cho các cam kết thêm và xóa các tệp nhị phân của bạn và ghi chú SHA1 của chúng, chẳng hạn như 2bcdef
và 3cdef3
.
Sau đó, để chỉnh sửa lịch sử của repo, hãy sử dụng rebase -i
lệnh với tùy chọn tương tác của nó, bắt đầu với cấp độ gốc của cam kết nơi bạn đã thêm các tệp nhị phân của mình. Nó sẽ khởi chạy $ EDITOR của bạn và bạn sẽ thấy danh sách các cam kết bắt đầu bằng 2bcdef
:
$ git rebase -i 2bcdef^ # generate a pick list of all commits starting with 2bcdef
# Rebasing zzzzzz onto yyyyyyy
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 2bcdef Add binary files and other edits
pick xxxxxx Another change
.
.
pick 3cdef3 Remove binary files; link to them as external resources
.
.
Chèn squash 3cdef3
làm dòng thứ hai và xóa dòng có nội dung pick 3cdef3
khỏi danh sách. Bây giờ bạn có một danh sách các hành động cho tương tác rebase
sẽ kết hợp các cam kết thêm và xóa các tệp nhị phân của bạn thành một cam kết có sự khác biệt chỉ là bất kỳ thay đổi nào khác trong các cam kết đó. Sau đó, nó sẽ áp dụng lại tất cả các cam kết tiếp theo theo thứ tự, khi bạn yêu cầu nó hoàn thành:
$ git rebase --continue
Quá trình này sẽ mất một hoặc hai phút.
Bây giờ bạn có một repo mà không còn các tệp nhị phân đến hoặc đi. Nhưng chúng vẫn sẽ chiếm dung lượng vì theo mặc định, Git giữ các thay đổi trong vòng 30 ngày trước khi chúng có thể được thu gom, vì vậy bạn có thể thay đổi quyết định của mình. Nếu bạn muốn xóa chúng ngay bây giờ:
$ git reflog expire --expire=1.minute refs/heads/master
#all deletions up to 1 minute ago available to be garbage-collected
$ git fsck --unreachable # lists all the blobs(files) that will be garbage-collected
$ git prune
$ git gc
Bây giờ bạn đã loại bỏ bloat nhưng vẫn giữ phần còn lại của lịch sử của bạn.