Hai tệp gitignore mà không ai nói với bạn

Công nghệ23 tháng 9, 2026·5 phút đọc

Hầu hết lập trình viên chỉ biết đến .gitignore, nhưng Git thực ra đọc các mẫu bỏ qua từ ba nơi khác nhau. Hai tệp còn lại — .git/info/exclude và tệp loại trừ toàn cục — cho phép bạn giữ cây làm việc sạch sẽ mà không cần chia sẻ thói quen ghi chú cá nhân với cả nhóm.

Hai tệp gitignore mà không ai nói với bạn

Nhiều lập trình viên có thói quen mang theo các tệp chưa được theo dõi (untracked) trong kho mã nguồn của mình. Vấn đề là cho đến gần đây, cách duy nhất để bỏ qua một tệp trong Git là thêm nó vào .gitignore — nhưng tệp này lại được commit và chia sẻ với tất cả mọi người. Hóa ra Git còn đọc các mẫu bỏ qua từ hai nơi khác mà ít ai biết đến.

Vấn đề với .gitignore truyền thống

Tác giả bài viết gốc thừa nhận một thói quen xấu: mang theo các tệp chưa được theo dõi trong các kho mã nguồn mình làm việc. Ông từng học được bài học rằng những tệp này tuyệt đối không được chứa thông tin bí mật, bởi sớm muộn gì chúng cũng bị commit nhầm.

Ông học được điều này theo cách nhẹ nhàng — bằng cách chứng kiến một đồng nghiệp học theo cách đau đớn: cuống cuồng viết lại lịch sử Git để che dấu vết, rồi luống cuống xoay vòng thông tin xác thực trên cloud.

Ngày nay, các tệp chưa theo dõi của ông đã vô hại hơn: những ghi chú markdown lộn xộn và thường là các kế hoạch của AI agent. Nhưng .gitignore được commit, nên việc đẩy cái tên tệp ngớ ngẩn mà ông tự đặt cho ghi chú riêng tư lên kho từ xa khiến ông cảm thấy không sạch sẽ. Kết quả là ông chẳng làm gì cả, và các tệp chưa theo dõi cứ chồng chất lên — khoảng mười kế hoạch vào lần đếm cuối.

Ba tệp bỏ qua của Git

Hóa ra Git đọc các mẫu bỏ qua từ ba nơi, tất cả đều dùng cùng một cú pháp:

  • .gitignore (trong bất kỳ thư mục nào): Ảnh hưởng đến mọi người sao chép kho mã nguồn. Được commit. Dùng cho kết quả build và môi trường cục bộ: target/, __pycache__/, .venv/.
  • .git/info/exclude: Chỉ ảnh hưởng đến bản sao này. Không được commit. Dùng cho các tệp nháp cá nhân mà dự án không cần biết đến.
  • Tệp loại trừ toàn cục (do core.excludesFile thiết lập, mặc định là ~/.config/git/ignore): Ảnh hưởng đến mọi kho mã nguồn bạn làm việc trên máy này. Không được commit. Dùng cho các tệp lộn xộn từ trình soạn thảo và hệ điều hành: .idea/, .vscode/, Thumbs.db, .DS_Store.

Tệp theo từng kho mã nguồn, .git/info/exclude, chính là thứ đáng phấn khích nhất. Nó nằm bên trong thư mục .git, nên không thể bị commit dù là vô tình, và không ai khác nhìn thấy nó bao giờ.

Cách sử dụng chúng

Hai tệp mới này là các tệp văn bản thuần túy, nhận cùng các mẫu như .gitignore. Không có lệnh Git chuyên dụng nào — bạn chỉ cần thêm vào chúng.

Theo từng kho mã nguồn, từ thư mục gốc của kho:

echo 'plans/' >> .git/info/exclude
echo '*.notes.md' >> .git/info/exclude

Các mẫu được khớp tương đối so với thư mục gốc của kho, đúng như khi chúng nằm trong một tệp .gitignore ở cấp cao nhất. Tệp này thường đã tồn tại sẵn, với một vài ví dụ đã được chú thích.

Một lưu ý quan trọng: trong một git worktree được liên kết, .git là một tệp chứ không phải thư mục, nên đường dẫn trên sẽ không hoạt động. Tệp exclude nằm trong .git/info/exclude của kho chính và bao phủ mọi worktree. Lệnh sau sẽ trỏ đúng tệp từ kho chính và từ bất kỳ worktree liên kết nào:

echo 'plans/' >> "$(git rev-parse --git-common-dir)/info/exclude"

Để thiết lập toàn cục:

mkdir -p ~/.config/git
echo '.DS_Store' >> ~/.config/git/ignore
echo '.idea/' >> ~/.config/git/ignore

Git tự động đọc ~/.config/git/ignore nếu tệp tồn tại (hoặc $XDG_CONFIG_HOME/git/ignore nếu bạn đã đặt biến đó); không cần cấu hình gì thêm. Nếu muốn giữ tệp ở nơi khác, chỉ cần trỏ Git đến đó một lần:

git config --global core.excludesFile ~/.gitignore_global

Dù dùng tệp nào, git status cũng ngừng liệt kê các tệp đó ngay lập tức, miễn là chúng chưa từng được theo dõi. Các quy tắc bỏ qua không bao giờ áp dụng cho các tệp đã được theo dõi.

Ghi chú về Claude Code

Vì việc bỏ qua các kế hoạch của agent là ví dụ xuyên suốt, cần lưu ý: theo mặc định, Claude Code loại các tệp bị bỏ qua khỏi tính năng tự động hoàn thành khi bạn tham chiếu một tệp bằng ký hiệu @. Vì vậy, ngay khi các kế hoạch của bạn vào .git/info/exclude, chúng sẽ biến mất khỏi danh sách chọn.

Để lấy lại chúng, hãy thêm đoạn sau vào settings.json (hoặc bật tùy chọn Respect .gitignore in file picker trong /config):

{
  "respectGitignore": false
}

Điều này chỉ liên quan đến tính năng tự động hoàn thành @. Claude Code vẫn có thể đọc các tệp bất kể thiết lập này; nó chỉ không đề xuất chúng khi bạn đang gõ.

Kết luận

Nếu giống như tác giả, bạn chỉ biết đến .gitignore và cảm thấy e dè khi chia sẻ thói quen ghi chú của mình với mọi người trong dự án, thì giờ đây bạn có thể có một cây làm việc sạch sẽ mà không cảm thấy bị phơi bày. Hai tệp bỏ qua còn lại là một công cụ đơn giản nhưng mạnh mẽ mà bất kỳ lập trình viên nào cũng nên biết.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗