Như đã đề cập trong câu trả lời SO này , git gc
thực sự có thể tăng kích thước của repo!
Xem thêm chủ đề này
Giờ đây, git có một cơ chế an toàn để không xóa các đối tượng không được tham chiếu ngay khi đang chạy ' git gc
'.
Theo mặc định, các đối tượng không tham chiếu được giữ trong khoảng thời gian 2 tuần. Điều này là để giúp bạn dễ dàng khôi phục các nhánh hoặc cam kết đã vô tình bị xóa, hoặc để tránh một cuộc đua trong đó một đối tượng vừa được tạo đang trong quá trình tồn tại nhưng chưa được tham chiếu có thể bị xóa bởi một git gc
quy trình '' chạy song song.
Vì vậy, để cung cấp thời gian gia hạn đó cho các đối tượng được đóng gói nhưng không được tham chiếu, quá trình đóng gói lại đẩy các đối tượng không được tham chiếu đó ra khỏi gói về dạng lỏng lẻo để chúng có thể già đi và cuối cùng bị cắt bớt.
Mặc dù vậy, các đối tượng trở nên không được tham chiếu thường không nhiều. Có khá nhiều đối tượng không được tham chiếu 404855 và việc gửi các đối tượng đó ngay từ đầu thông qua một bản sao là điều ngu ngốc và hoàn toàn lãng phí băng thông mạng.
Dù sao ... Để giải quyết vấn đề của bạn, bạn chỉ cần chạy ' git gc
' với --prune=now
đối số để vô hiệu hóa thời gian gia hạn đó và loại bỏ các đối tượng không được tham chiếu đó ngay lập tức (chỉ an toàn nếu không có hoạt động git nào khác diễn ra cùng lúc dễ dàng đảm bảo trên máy trạm).
Và BTW, sử dụng ' git gc --aggressive
' với phiên bản git mới hơn (hoặc ' git repack -a -f -d --window=250 --depth=250
')
Các chủ đề cùng đề cập đến :
git config pack.deltaCacheSize 1
Điều đó giới hạn kích thước bộ nhớ cache delta ở một byte (vô hiệu hóa nó một cách hiệu quả) thay vì mặc định là 0, nghĩa là không giới hạn. Với điều đó, tôi có thể đóng gói lại kho lưu trữ đó bằng git repack
lệnh trên trên hệ thống x86-64 với 4GB RAM và sử dụng 4 luồng (đây là lõi tứ). Mặc dù vậy, mức sử dụng bộ nhớ thường trú đã tăng lên gần 3,3GB.
Nếu máy của bạn là SMP và bạn không có đủ RAM thì bạn có thể giảm số luồng chỉ còn một:
git config pack.threads 1
Ngoài ra, bạn có thể giới hạn hơn nữa việc sử dụng bộ nhớ với --window-memory argument
' git repack
'.
Ví dụ, việc sử dụng --window-memory=128M
nên giữ giới hạn trên hợp lý về việc sử dụng bộ nhớ tìm kiếm delta mặc dù điều này có thể dẫn đến kết quả khớp delta kém tối ưu hơn nếu repo chứa nhiều tệp lớn.
Ở mặt trước nhánh bộ lọc, bạn có thể xem xét (thận trọng) tập lệnh này
#!/bin/bash
set -o errexit
# Author: David Underhill
# Script to permanently delete files/folders from your git repository. To use
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2
if [ $# -eq 0 ]; then
exit 0
fi
# make sure we're at the root of git repo
if [ ! -d .git ]; then
echo "Error: must run this script from the root of a git repository"
exit 1
fi
# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD
# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune