Câu trả lời:
Một đối tượng (đốm, cây và cam kết) với SHA nói - 810cae53e0f622d6804f063c04a83dbc3a11b7ca sẽ được lưu trữ tại
.git/objects/81/0cae53e0f622d6804f063c04a83dbc3a11b7ca
(sự phân chia trong hai ký tự đầu tiên để cải thiện hiệu năng của hệ thống Tệp vì hiện tại không phải tất cả các đối tượng được lưu trữ trong cùng một thư mục)
Các đối tượng được lưu trữ như trên được gọi là các đối tượng lỏng lẻo.
Khi bạn bắt đầu với repo của bạn, bạn chủ yếu có các đối tượng lỏng lẻo. Khi số lượng tăng cao, nó trở nên không hiệu quả và chúng được lưu trữ trong một tệp gói. Những đối tượng như vậy được gọi là đối tượng đóng gói.
git gc
là những gì bạn chạy để đóng gói các đối tượng (Thông thường các đối tượng lỏng lẻo không cần thiết và vài tuần tuổi cũng bị xóa và với --prune=<date>
tùy chọn, bạn có thể buộc xóa các đối tượng lỏng lẻo không còn cần thiết. Giống như khi bạn sửa đổi một cam kết. Đối tượng cam kết cũ là không cần lâu hơn.)
--prune
tùy chọn được kích hoạt theo mặc định, và kể từ khi git gc
được tự động kích hoạt bởi việc sử dụng chung (ví dụ commit
), bạn thường không cần phải lo lắng về việc này. Tôi không sử dụng git gui và tôi không thể tìm thấy chính xác nơi nó được kích hoạt trong nguồn, nhưng nó sẽ tự kiểm tra hoặc chỉ chặn lệnh gc
được kích hoạt bằng lệnh được gọi. Tuy nhiên, chắc chắn không có gì phải lo lắng về việc sử dụng thông thường.
git gc
thủ công không? Tôi nghĩ rằng nó nên được cải thiện, bởi vì các đối tượng lỏng lẻo là không hiệu quả, và 50.000 là một con số rất lớn. Tôi cũng phát hiện ra rằng việc đóng gói cũng làm giảm đáng kể không gian sử dụng của .git
thư mục.
Sách Git giải thích điều đó khá hay: https://git-scm.com/book/en/v2/Git-Iternals-Packfiles
Các đối tượng lỏng lẻo là định dạng đơn giản hơn. Nó chỉ đơn giản là dữ liệu nén được lưu trữ trong một tệp duy nhất trên đĩa. Mỗi đối tượng được ghi vào một tập tin riêng biệt.
git gc
cho bạn, với một thanh tiến trình GUI đẹp (mặc dù được hiển thị là bị kẹt hầu hết thời gian).