Chuyển đến nội dung chính

Git Prune: Git Pruning là gì và cách sử dụng Git Prune

Git prune là một lệnh Git dùng để xóa các đối tượng trong kho không còn có thể truy cập từ bất kỳ commit hoặc nhánh nào, giúp giải phóng dung lượng đĩa.
· 5 phút đọc

Khám phá cùng AI

Git áp dụng cách tiếp cận bảo vệ khi xóa dữ liệu để ngăn ngừa việc mất mát ngoài ý muốn các commit hoặc dữ liệu quan trọng.

Tuy nhiên, điều này có thể khiến dữ liệu lỗi thời, như tham chiếu đến các nhánh đã xóa, vẫn còn hiển thị. Theo thời gian, kho Git có thể tích tụ các đối tượng không được tham chiếu, tiêu tốn dung lượng đĩa không cần thiết và có thể gây nhầm lẫn.

Lệnh git prune command là một tiện ích dọn dẹp trong Git, chủ yếu dùng để loại bỏ các đối tượng không thể truy cập trong kho.

Một đối tượng không thể truy cập là đối tượng không thể được truy cập bởi bất kỳ nhánh, thẻ (tag), nhánh theo dõi từ xa (remote-tracking branch) hoặc tham chiếu nào khác. Những đối tượng này có thể chiếm chỗ trong kho, làm nó lộn xộn với dữ liệu không cần thiết theo thời gian.

Mặc dù git prune là công cụ mạnh để giữ kho gọn nhẹ, hầu hết người dùng có thể không cần dùng trực tiếp vì Git có cơ chế gom rác tự động (git gc). Tuy vậy, hiểu vai trò và chức năng của nó sẽ hữu ích cho người dùng Git nâng cao hoặc trong các tình huống cụ thể cần hoặc ưu tiên bảo trì kho thủ công.

git prune là gì?

Lệnh git prune được dùng để xóa các đối tượng không còn cần thiết trong kho cục bộ. Những đối tượng này có thể là commit, tree (ảnh chụp thư mục), blob (tệp) và tag không còn có thể truy cập từ bất kỳ nhánh hoặc tag nào trong kho.

Nói đơn giản, git prune giúp dọn sạch các tệp và dữ liệu không cần thiết trong kho, tiết kiệm dung lượng và giảm lộn xộn.

Các đối tượng trở nên không thể truy cập như thế nào?

Đối tượng có thể trở nên không thể truy cập theo nhiều cách—ví dụ, bằng việc xóa nhánh hoặc viết lại commit. Khi các nhánh bị xóa, mọi commit chỉ có ở các nhánh đó mà không thuộc bất kỳ nhánh hoặc tag nào khác sẽ trở nên không thể truy cập.

Việc viết lại commit bằng các lệnh như git rebase tạo ra các commit mới và loại bỏ commit cũ, khiến chúng cũng trở nên không thể truy cập.

Thời gian ân hạn và reflog

Git duy trì một nhật ký cập nhật đầu nhánh và các tham chiếu khác gọi là reflog (reference log). Ta có thể xem nó bằng lệnh git reflog.

Ngay cả khi một đối tượng không thể truy cập, nếu nó vẫn còn trong reflog thì git prune sẽ không xóa nó.

Mặc định, reflog có thời hạn 90 ngày, cung cấp một khoảng ân hạn trong đó các đối tượng không thể truy cập được lưu tạm thời và không bị prune ngay lập tức.

Khi nào nên dùng git prune

Thông thường, chúng ta không cần dùng trực tiếp git prune. Git có cơ chế gom rác chạy tự động sau một số lệnh để dọn dẹp tệp không cần thiết và tối ưu hiệu năng kho cục bộ bằng cách nén một số tệp.

Tuy nhiên, đôi khi chúng ta muốn dọn kho thủ công, ví dụ:

  • Sau khi thực hiện thao tác mà ta biết sẽ tạo ra đối tượng không thể truy cập, như xóa nhánh. 
  • Muốn giải phóng dung lượng đĩa ngay lập tức.
  • Giữ cho kho luôn gọn gàng và sạch sẽ.

Gom rác với git gc

Thay vì prune trực tiếp, thường nên dựa vào cơ chế gom rác, cơ chế này không chỉ thực hiện git prune mà còn tối ưu dung lượng bằng cách nén các đối tượng.

Như đã đề cập, gom rác sẽ được thực thi tự động sau một số lệnh. Ta có thể gọi gom rác thủ công bằng lệnh:

git gc

Cách sử dụng git prune

Vì git prune sẽ xóa dữ liệu, nên khuyến nghị chạy trước với tùy chọn --dry-run.

git prune --dry-run

Tùy chọn này sẽ liệt kê các đối tượng sẽ bị prune mà không thực sự xóa chúng. Đầu ra có thể trông như sau:

0d7dff8258654c03a058987b3e63c86feca9200d commit
ea1380f52f0bfa0142e46767adfd56593681091a blob
fa91af78a1ab453c1d7632192b3ca8bf217ec711 commit

Đầu ra cho biết có hai commit và một blob không thể truy cập và sẽ bị xóa. Sau khi chắc chắn không có dữ liệu quan trọng nào được liệt kê, ta có thể tiến hành dọn dẹp:

git prune

Trong một số tình huống, ta muốn dọn kho ngay sau khi thực hiện hành động mà ta biết sẽ tạo đối tượng không thể truy cập, như xóa nhánh. Ta có thể chạy git prune --dry-run, nhưng đầu ra trống. Lý do là các commit đã xóa vẫn còn được tham chiếu trong reflog.

Nếu không muốn đợi chúng hết hạn khỏi reflog, ta có thể cho hết hạn thủ công bằng lệnh:

git reflog expire --expire-unreachable=now --all

Cùng phân tích các tùy chọn đã dùng:

  • Tùy chọn --expire-unreachable=now đặt thời điểm hết hạn của mọi đối tượng không thể truy cập là ngay bây giờ, khiến chúng hết hạn lập tức.
  • Tùy chọn --all áp dụng cho mọi mục reflog trong kho. Nếu không có tùy chọn này, ta phải chỉ định một ref cụ thể (như nhánh hoặc tag) để thao tác.

git prune: Sử dụng nâng cao

Hãy xem một số kỹ thuật nâng cao, như chỉ định thời điểm hết hạn hoặc prune các tệp đã được pack.

Chỉ định thời điểm hết hạn

Đôi khi ta chỉ muốn dọn các đối tượng không thể truy cập đã cũ, chẳng hạn chỉ prune các đối tượng ít nhất hai tuần tuổi.

Tùy chọn --expire <time> cho phép đặt mốc thời gian. Git sẽ xóa các đối tượng đã không thể truy cập lâu hơn thời gian chỉ định. Tham số <time> chấp nhận nhiều định dạng như "2 weeks ago", "3 days", "yesterday", v.v., mang lại sự linh hoạt khi chỉ định thời hạn.

Ví dụ lệnh:

git prune --expire=2.weeks.ago

Prune các tệp đã được pack

Git lưu trữ đối tượng theo hai cách chính: dưới dạng tệp riêng lẻ (loose objects) và trong các tệp pack. Packing là cơ chế tiết kiệm dung lượng và cải thiện hiệu năng bằng cách lưu nhiều đối tượng trong một tệp và loại bỏ dư thừa.

Đôi khi, một đối tượng có thể tồn tại ở cả dạng loose và pack. Mặc dù sự dư thừa này không gây hại (ngoài việc chiếm thêm chút dung lượng đĩa), ta có thể muốn dọn các đối tượng loose đã được pack để thu hồi dung lượng.

Lệnh git prune-packed xóa các đối tượng loose nếu chúng đã nằm trong một pack. Khác với git prune, git prune-packed không nhận các tùy chọn như --expire <time>. Nó chỉ đơn giản dọn các đối tượng loose đã được pack.

Kết luận

Trong quá trình sử dụng kho, một số đối tượng sẽ trở nên không thể truy cập, gây tốn dung lượng đĩa không cần thiết. Git xử lý điều này bằng hệ thống gom rác, xóa các đối tượng không thể truy cập sau một thời gian không hoạt động.

Cơ chế gom rác được Git thực thi tự động sau một số lệnh. Nhưng ta cũng có thể chạy thủ công bằng lệnh git gc. Quá trình gom rác không chỉ xóa các đối tượng không thể truy cập bằng git prune mà còn tối ưu dung lượng bằng cách nén một số đối tượng.

Người dùng Git nâng cao có thể muốn tự duy trì kho sạch. Lệnh git prune cho phép xóa thủ công các đối tượng không thể truy cập. Ta nên luôn chạy git prune --dry-run trước khi chạy git prune để có cái nhìn tổng quan về các đối tượng sẽ bị xóa trong quá trình prune.

François Aubry

Tác giả

François Aubry

Kỹ sư full-stack & nhà sáng lập tại CheapGPT. Giảng dạy luôn là niềm đam mê của tôi. Từ những ngày còn là sinh viên, tôi đã háo hức tìm kiếm cơ hội kèm cặp và hỗ trợ các bạn học khác. Niềm đam mê đó đã thôi thúc tôi theo học tiến sĩ, nơi tôi cũng đảm nhiệm vai trò trợ giảng để hỗ trợ con đường học thuật của mình. Trong những năm ấy, tôi tìm thấy sự mãn nguyện lớn lao trong môi trường lớp học truyền thống, xây dựng kết nối và thúc đẩy việc học tập. Tuy nhiên, với sự ra đời của các nền tảng học trực tuyến, tôi nhận ra tiềm năng thay đổi của giáo dục số. Thực tế, tôi đã trực tiếp tham gia phát triển một nền tảng như vậy tại trường đại học của chúng tôi. Tôi tận tâm kết hợp các nguyên tắc giảng dạy truyền thống với những phương pháp số đổi mới. Đam mê của tôi là tạo ra các khóa học không chỉ hấp dẫn và giàu thông tin mà còn dễ tiếp cận với người học trong thời đại số này.

Chủ đề

Liên quan