Cách sử dụng Git Shallow Clone để sao chép kho lưu trữ nhanh hơn

Tác giả sysadmin, T.Bảy 18, 2023, 01:55:49 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách sử dụng Git Shallow Clone để sao chép kho lưu trữ nhanh hơn


Kho Git lớn có thể sử dụng nhiều tài nguyên và làm chậm máy tính của bạn. Điều này đôi khi có thể được giảm thiểu bằng cách sử dụng tính năng sao chép nông, giúp loại bỏ tất cả trừ những lần xác nhận gần đây nhất, giúp việc tải xuống các kho lưu trữ Git có lịch sử lâu dài trở nên dễ dàng hơn.


1. Nhân bản nông là gì?

Nhân bản một kho lưu trữ không chỉ tạo ra một bản sao của toàn bộ kho lưu trữ mà còn cả lịch sử cam kết hoàn chỉnh của nó. Đối với hầu hết các kho lưu trữ, kích thước tổng thể và độ dài của lịch sử cam kết không phải là vấn đề. Tuy nhiên, đối với các kho lưu trữ thực sự lớn, việc sao chép tất cả dữ liệu đó có thể tốn nhiều thời gian và tài nguyên.

Ví dụ: nhân Linux đã sử dụng cùng một kho lưu trữ kể từ buổi bình minh. Nó có hơn 1,1 triệu cam kết. Quá trình sao chép này có thể mất tới một giờ trên phần cứng cũ hơn và sử dụng nhiều gigabyte RAM chỉ cho riêng quy trình Git. Tất nhiên, không phải kho lưu trữ nào cũng lớn như vậy, nhưng một số kho lưu trữ gần như vậy, và ngay cả những người đóng góp nhân Linux cũng không muốn ngồi trước bàn phím của họ hàng giờ đồng hồ để xem nó sao chép.


Sao chép nông là một kỹ thuật chỉ tìm nạp một số lượng hạn chế các lần xác nhận gần đây. Điều này dẫn đến một bản sao nhẹ và nhanh hơn mà vẫn giữ được chức năng cần thiết cho công việc của bạn, vì hầu hết mọi người không quan tâm đến các cam kết cũ hơn và bạn vẫn có thể gửi PR và đẩy các thay đổi mà không cần toàn bộ lịch sử.

Điều này cũng mang lại lợi ích to lớn cho quy trình Tích hợp liên tục (CI/CD), vì máy chủ xây dựng có thể không cần biết toàn bộ lịch sử Git chỉ để xây dựng ứng dụng. Nếu bạn đang viết các tập lệnh hoạt động với kho lưu trữ Git và chỉ quan tâm đến nội dung, thì có thể đáng để sử dụng sao chép nông thay thế.

Bên cạnh việc chỉ sao chép thời gian, các kho lưu trữ cạn nói chung chạy nhanh hơn, vì có ít lịch sử hơn để xử lý khi chạy các lệnh hàng ngày. Lịch sử thực sự dài cũng có thể khiến máy khách GUI Git bị lag, điều này có thể làm hỏng trải nghiệm.

2. Nhân bản nông một kho lưu trữ Git

Cách dễ nhất để sao chép nông là chỉ sử dụng

Mã nguồn [Chọn]
--depth
tham số trên git clone. Điều này sẽ giới hạn bản sao ở một số lượng nhất định, chẳng hạn như 100 lần xác nhận trước HEAD kho lưu trữ hiện tại. Tất cả các cam kết cũ khác sẽ bị cắt bớt khỏi lịch sử.

Mã nguồn [Chọn]
git clone --depth 100 [repository_URL]
Bạn cũng có thể sao chép nông mọi thứ sau một ngày nhất định, điều này sẽ hữu ích hơn nhiều nếu bạn không biết mình cần bao nhiêu lần xác nhận.

Mã nguồn [Chọn]
git clone --shallow-since="3 months" [repository_URL]
Tham số ngày có thể chấp nhận nhiều định dạng khác nhau, nhưng "X năm/tháng trước" đơn giản thường hoạt động tốt.

Ngoài ra còn có các phương pháp để thu hẹp kho lưu trữ Git hiện có, nhưng chúng thường lộn xộn và liên quan đến việc viết lại lịch sử và xóa thủ công tất cả các đối tượng cũ khỏi bộ đệm thu gom rác của Git. Chúng tôi khuyên bạn chỉ nên đẩy tất cả các thay đổi, xóa kho lưu trữ cũ và sao chép lại từ điều khiển từ xa nếu bạn muốn giảm kích thước kho lưu trữ hiện tại của mình.

3. Nhân bản nông chỉ một nhánh duy nhất

Sao chép nông có thể được kết hợp với một tính năng Git khác giới hạn bản sao chỉ ở một nhánh duy nhất. Nếu bạn chỉ đang tải xuống một kho lưu trữ để kiểm tra một nhánh tính năng, bạn có thể chạy lệnh này để thay thế:

Mã nguồn [Chọn]
git clone --depth 100 [repository_URL] --single-branch --branch=[branch]
4. Bản sao Blobless và Treeless

Một tùy chọn tương tự khác vẫn có thể lưu giữ lịch sử cam kết là sử dụng bản sao blobless. Trong Git, nội dung tệp thực tế được lưu trữ dưới dạng "đốm màu" và Git thêm vào trên cùng của cây này và cam kết theo dõi cách các đốm màu đó kết hợp với nhau.


Vì Git chủ yếu chỉ quan tâm đến các cam kết và cấu trúc cây, nên bạn có thể chọn bỏ qua các đốm màu và tải chúng xuống theo yêu cầu khi cần. Điều này có thể tăng tốc đáng kể thời gian nhân bản đồng thời duy trì lịch sử. Bạn cũng có thể kết hợp các bản sao không đốm và nông.

Để thực hiện việc này, hãy chạy git clone với bộ lọc:

Mã nguồn [Chọn]
git clone --filter=blob:none [repository_URL]
Các bản sao không có cây cũng tương tự và thường được sử dụng để tự động hóa, nhưng thường không được khuyến nghị sử dụng hàng ngày vì chúng thực sự có thể chậm hơn đối với các hoạt động Git hàng ngày.

Mã nguồn [Chọn]
git clone --filter=tree:0 [repository_URL]
Tuy nhiên, thông thường, các bản sao nông sẽ vẫn nhanh hơn và các bản sao không đốm sẽ tăng kích thước theo thời gian vì cần truy cập nhiều phần hơn của repo.