Mọi repository Git đều cần tệp .gitignore. Đây là danh sách dạng văn bản thuần gồm các đường dẫn Git *không* nên theo dõi: sản phẩm build, thư mục thư viện phụ thuộc, cấu hình IDE, rác của hệ điều hành như .DS_Store. Không có nó, commit đầu tiên sẽ vô tình kéo theo node_modules/, .env và target/, và dọn mớ đó còn phiền hơn nhiều so với viết tệp này đúng ngay từ đầu.
Mỗi hệ sinh thái bỏ qua những thứ khác nhau, và hầu hết dự án dùng nhiều hệ sinh thái cùng lúc. Một app Node + TypeScript điển hình trên laptop macOS với VS Code đã cần gộp bốn danh sách bỏ qua khác nhau. Tự viết theo trí nhớ thì dễ quên coverage/, lộ một tệp .env, hoặc commit nhầm .idea/ từ cấu hình JetBrains của đồng đội.
Vì vậy công cụ này gom các mẫu được chọn lọc từ dự án chuẩn github/gitignore, cũng là bộ quy tắc đứng sau gợi ý tự động chính thức của GitHub, và cho bạn xếp chồng chúng lại. Đánh dấu những ô phù hợp, bạn sẽ có một .gitignore không trùng lặp để dán thẳng vào repo. Không cần tài khoản, không tải lên gì, chạy hoàn toàn trong trình duyệt.
Bạn sẽ học được gì khi tạo .gitignore
Mẫu trong .gitignore dùng cú pháp glob: *.log bỏ qua mọi tệp log, build/ bỏ qua một thư mục, !important.log bỏ việc bỏ qua cho một tệp cụ thể dù có glob khớp với nó.
Mẫu được áp dụng tương đối theo vị trí của tệp .gitignore: một .gitignore nằm trong src/ chỉ ảnh hưởng đến các tệp trong src/.
Các tệp đã được theo dõi **không** bị bỏ qua hồi tố. Nếu bạn commit node_modules/ rồi mới thêm nó vào .gitignore, bạn vẫn phải chạy git rm -r --cached node_modules để ngừng theo dõi.
Nhiều tệp .gitignore có thể cùng tồn tại: ở thư mục gốc repo, trong thư mục con, cộng thêm một ~/.gitignore_global toàn cục cho công cụ cá nhân như JetBrains hay hệ điều hành của bạn.
Thứ tự quan trọng với phủ định: một !pattern phía sau chỉ có tác dụng nếu một quy tắc trước đó thực sự đã bỏ qua tệp. Phủ định một thư mục không thể bỏ việc bỏ qua cho một tệp nằm bên trong.
Cách tạo .gitignore từng bước
1
Chọn một bộ có sẵn (không bắt buộc)
Nếu dự án khớp với một tổ hợp phổ biến như Next.js, Django, Rails, hãy nhấn vào bộ có sẵn để đánh dấu tất cả ô liên quan cùng lúc. Sau đó bỏ bớt hoặc thêm vài mục nếu bạn có thêm công cụ khác.
2
Thêm ngôn ngữ
Ngôn ngữ nào cũng có sản phẩm cần bỏ qua: Node có node_modules/, Python có __pycache__/ và virtualenv, Java có target/ và các tệp .class. Chọn những ngôn ngữ mà dự án thực sự biên dịch.
3
Thêm framework
Ngoài quy tắc của ngôn ngữ, framework còn thêm thư mục build riêng: Next.js cần .next/ và .vercel, Django cần staticfiles/ và db.sqlite3, Rails cần tmp/ và /storage/*. Đánh dấu framework nếu bạn dùng nó.
4
Thêm trình soạn thảo và hệ điều hành
Thêm mẫu cho các trình soạn thảo mà **cả nhóm** dùng (không chỉ bạn): nếu có ai dùng JetBrains hay Vim, hãy thêm vào. Sau đó thêm các hệ điều hành trong nhóm: macOS tạo ra .DS_Store, Windows tạo ra Thumbs.db, cả hai đều rất dễ bị commit nhầm.
5
Sao chép hoặc tải về
Khung bên phải hiển thị kết quả đã gộp và bỏ trùng lặp. Nhấn **Sao chép** để dán thẳng vào .gitignore ở thư mục gốc repo, hoặc **Tải về** để lưu tệp trực tiếp.
Mức tối thiểu cho mọi dự án Node chia sẻ với đồng đội dùng macOS. Kể cả dự án phụ nhỏ xíu cũng nên có các quy tắc này: thiếu .DS_Store và node_modules/, bạn sẽ phải xử lý những xung đột vô nghĩa.
Một backend Django điển hình được phát triển trong PyCharm. Lưu ý db.sqlite3 cục bộ bị bỏ qua: môi trường production không bao giờ dùng nó, và commit nó sẽ làm lộ dữ liệu dev và làm hỏng bản clone mới của đồng đội.
Ghi đè một quy tắc bằng phủ định
Bỏ qua mọi log trừ một tệp
*.log
!keep-me.log
Dòng đầu bỏ qua mọi tệp .log. Quy tắc !keep-me.log sau đó đưa đúng tệp đó trở lại. Phủ định chỉ có tác dụng với tệp mà quy tắc trước đó thực sự đã bỏ qua: bạn không thể bỏ việc bỏ qua cho một tệp nằm trong thư mục đã bị bỏ qua.
Lỗi .gitignore thường gặp
Thêm .gitignore sau khi đã commit và mong các tệp đã commit biến mất. Chúng không biến mất: bạn phải chạy git rm -r --cached <path> để ngừng theo dõi.
Commit .env dù chỉ một lần. Chỉ một commit cũng làm lộ bí mật vĩnh viễn trong lịch sử repo. Thêm .env* vào .gitignore **trước** commit đầu tiên, và đổi ngay mọi bí mật đã lỡ lọt vào.
Quên rác riêng của hệ điều hành trong repo dùng chung. Chỉ cần một đồng đội dùng macOS mà repo không có quy tắc .DS_Store, các tệp đó sẽ xuất hiện trong diff của mọi PR và làm chậm việc review.
Cố bỏ việc bỏ qua cho một tệp nằm trong thư mục đã bị bỏ qua. Khi đã bỏ qua build/, không phủ định nào đưa build/keep.txt trở lại được: Git thậm chí không nhìn vào bên trong thư mục. Hãy sắp xếp lại cấu trúc hoặc chuyển tệp ra ngoài.
Trộn cấu hình trình soạn thảo chỉ mình bạn dùng vào .gitignore của dự án. Chỉ bạn dùng JetBrains trong một nhóm dùng VS Code? Hãy đặt .idea/ vào ~/.gitignore_global **toàn cục** của bạn.
Câu hỏi thường gặp về công cụ tạo .gitignore
Các mẫu .gitignore này lấy từ đâu?
Các mẫu được rút gọn từ dự án mã nguồn mở github/gitignore, cũng là nguồn mà GitHub dùng khi bạn đánh dấu "add .gitignore" lúc tạo repo mới. Chúng tôi đã cắt gọn từng mẫu chỉ còn những quy tắc các nhóm thực sự cần và nhóm chúng theo danh mục.
Có cần commit chính tệp .gitignore không?
Có. .gitignore được tạo ra để quản lý phiên bản và chia sẻ với nhóm. Đây là *thỏa thuận* về những gì nên và không nên theo dõi. Ngoại lệ là tùy chọn cá nhân (ví dụ trình soạn thảo bạn thích): những thứ đó thuộc về ~/.gitignore_global toàn cục của bạn.
Làm sao ngừng theo dõi một tệp đã được commit?
Thêm nó vào .gitignore trước, rồi chạy git rm --cached <path> (hoặc git rm -r --cached <folder>) để xóa nó khỏi index mà không xóa trên ổ đĩa. Commit cả hai thay đổi cùng lúc để đồng đội thấy cập nhật.
Một repo có thể có nhiều tệp .gitignore không?
Có. Git tìm .gitignore trong từng thư mục và áp dụng quy tắc cho cây con đó. Điều này hữu ích với monorepo, nơi frontend và backend có quy tắc bỏ qua rất khác nhau: giữ quy tắc ở thư mục gốc cho rác chung của hệ điều hành và trình soạn thảo, còn quy tắc theo ngôn ngữ thì đặt trong thư mục của từng package.
.gitignore và .git/info/exclude khác nhau thế nào?
.gitignore được commit và chia sẻ với nhóm. .git/info/exclude chỉ nằm trong bản clone cục bộ của bạn, dành cho những loại trừ cá nhân bạn không muốn push. Để loại trừ trên tất cả repo của bạn, hãy dùng ~/.gitignore_global toàn cục.