Featured image of post Tại sao Git không theo dõi thư mục trống? .gitkeep và .gitignore là gì?

Tại sao Git không theo dõi thư mục trống? .gitkeep và .gitignore là gì?

Tìm hiểu sâu về lý do tại sao Git bỏ qua các thư mục trống và cách sử dụng .gitkeep và .gitignore đúng cách để quản lý cấu trúc thư mục dự án. Bao gồm các ví dụ thực tế và các phương pháp hay nhất.

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ên
  • tmp/: Tập tin tạm thời
  • cache/: 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?

  1. Tạo một tập tin có tên .gitkeep bên trong thư mục trống.
  2. Nội dung tập tin có thể để trống, hoặc bạn có thể viết “Keep this directory”.
  3. Thực hiện git addcommit tậ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

  • .gitkeep là 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 .gitignore hoạt động; .gitkeep chỉ là một công cụ nhỏ để giúp Git “hiểu” các thư mục trống.

Reference

All rights reserved,未經允許不得隨意轉載
Built with Hugo
Theme Stack thiết kế bởi Jimmy