Nói một cách đơn giản, .gitkeep là một tập tin giả (dummy file) theo quy ước. Sự tồn tại của nó chỉ phục vụ một mục đích duy nhất: buộc Git theo dõi một thư mục mà lẽ ra phải trống.
Tại sao lại cần nó?
Logic thiết kế của Git là “theo dõi thay đổi của tập tin”, không phải “theo dõi thư mục”. Nếu dự án của bạn chứa một thư mục trống, Git sẽ hoàn toàn bỏ qua nó và sẽ không tải nó lên GitHub hoặc máy chủ của bạn.
Điều này tạo ra một vấn đề: đôi khi mã của bạn yêu cầu một thư mục nhất định phải tồn tại để chạy, nhưng bạn không muốn tải lên dữ liệu thử nghiệm hoặc tập tin tạm thời. Nếu thư mục không tồn tại, chương trình có thể bị lỗi.
Những thư mục này thường là:
logs/: Dành cho tập tin nhật ký (log files)uploads/: Tập tin do người dùng tải lêntmp/: Tập tin tạm thờicache/: Dữ liệu bộ nhớ đệm
Những thư mục này cần thiết khi chạy (runtime), nội dung của chúng không nên được commit, nhưng bản thân thư mục phải tồn tại.
Cách nó hoạt động
Để “đánh lừa” Git giữ lại thư mục này, chúng ta đặt một tập tin ẩn không có chức năng thực tế vào trong đó, khiến Git nghĩ rằng, “Ồ! Có thứ gì đó ở đây, tôi cần ghi lại nó.”
Ví dụ thực tế:
Hãy tưởng tượng bạn đang xây một ngôi nhà (viết một dự án):
| Tập tin | Mô tả |
|---|---|
.gitignore |
Giống như một “Nhãn Không Đổ Rác”, bảo cho người dọn dẹp (Git) biết những thứ gì (như thức ăn hết hạn, giấy vụn) tuyệt đối không được chuyển vào nhà mới. |
.gitkeep |
Giống như một “Hộp Giữ Chỗ”. Nhà mới chưa có nội thất, nhưng bạn cần dành chỗ cho phòng kho, vì vậy bạn đặt một chiếc hộp ở đó để cho những người chuyển nhà biết khu vực này là một phần của ngôi nhà và không nên bị tháo dỡ. |
Cách sử dụng?
- Tạo một tập tin có tên
.gitkeepbên trong thư mục trống. - Nội dung tập tin có thể để trống, hoặc bạn có thể viết “Keep this directory”.
- Thực hiện
git addvàcommittập tin này.
So sánh .gitkeep vs .gitignore
| Tính năng | .gitkeep |
.gitignore |
|---|---|---|
| Trạng thái chính thức | Không chính thức (Chỉ là quy ước cộng đồng) | Chính thức (Tính năng tích hợp của Git) |
| Chức năng chính | Giữ một thư mục, ngăn nó bị Git lãng quên | Loại trừ tập tin, ngăn chúng bị Git theo dõi |
| Tình huống phổ biến | Thư mục log trống, thư mục cache | Tập tin mật khẩu, node_modules, tập tin tạm |
Lời khuyên thực tế: Tư duy đột phá
Mặc dù .gitkeep được sử dụng phổ biến, nhưng thực tế nó không phải là một phần chính thức của Git. Trên thực tế, bạn có thể sử dụng README.md hoặc .placeholder để đạt được hiệu quả tương tự. Nhưng tại sao mọi người lại thích dùng .gitkeep? Bởi vì nó tự giải thích: “Tập tin này không làm gì cả ngoài việc giữ cho Git không xóa thư mục này.”
Nếu bạn muốn trông chuyên nghiệp hơn một chút, có một cách tiếp cận sáng tạo hơn và chức năng hơn là chỉ sử dụng .gitkeep:
Đặt một tập tin .gitignore vào thư mục trống với nội dung sau:
# Bỏ qua mọi thứ trong thư mục này
*
# Nhưng đừng bỏ qua tôi (chính tập tin .gitignore này)
!.gitignore
Điều này đảm bảo rằng bạn giữ lại thư mục trong khi đảm bảo rằng các tập tin rác bên trong không bao giờ vô tình được commit. Đây là phương pháp “phòng ngừa sai sót” (Foolproof) thực sự.
Kết luận
.gitkeeplà sự thỏa hiệp của con người đối với logic thiết kế của Git.- Nó không phải là đặc tả chính thức, nhưng đã trở thành tiêu chuẩn thực tế cho các nhà phát triển.
- Điều thực sự quan trọng là hiểu cách
.gitignorehoạt động;.gitkeepchỉ là một công cụ nhỏ để giúp Git “hiểu” các thư mục trống.