Domain 2 · 8 phút đọc

Bỏ qua file với .gitignore

Ignoring Files with .gitignore

Không phải file nào cũng nên đưa vào Git: thư mục node_modules, file build, log, secret… Việc commit chúng làm repo phình to và lộ thông tin nhạy cảm. File .gitignore cho Git biết những gì cần bỏ qua, không theo dõi.

.gitignore là gì

.gitignore là một file text đặt trong repo (thường ở thư mục gốc), liệt kê các pattern. Bất kỳ file nào khớp pattern sẽ bị Git bỏ qua: không hiện trong git status, không bị git add . nhặt vào.

# Ví dụ nội dung .gitignore
node_modules/
*.log
.env
dist/

Cú pháp pattern

PatternÝ nghĩa
*.logMọi file kết thúc bằng .log
node_modules/Cả thư mục node_modules (dấu / cuối = thư mục)
/buildChỉ build ở thư mục gốc repo (dấu / đầu)
temp?.txttemp1.txt, tempA.txt… (? khớp 1 ký tự)
!keep.logNgoại lệ: không bỏ qua keep.log
# ghi chúDòng comment, bị bỏ qua

Dấu ! ở đầu tạo ngoại lệ — ví dụ bỏ qua mọi .log trừ một file cụ thể:

*.log
!important.log

Vấn đề: file đã commit rồi mới ignore

Đây là điểm hay gây bối rối: .gitignore chỉ có tác dụng với file chưa được track. Nếu một file đã được commit từ trước, thêm nó vào .gitignore sẽ không làm Git ngừng theo dõi — nó vẫn nằm trong lịch sử và tiếp tục được track.

Để gỡ một file đã track ra khỏi Git mà vẫn giữ trên đĩa:

# Gỡ file khỏi Git nhưng giữ lại trên ổ đĩa
git rm --cached .env

# Gỡ cả một thư mục đã lỡ commit
git rm -r --cached node_modules/

Sau đó commit thay đổi này; từ giờ file sẽ được .gitignore bỏ qua.

Đã push secret thì không đủ

Nếu bạn lỡ commit và push một secret (ví dụ .env chứa API key), chỉ thêm vào .gitignoregit rm --cachedchưa đủ — secret vẫn nằm trong lịch sử Git ở mọi bản clone. Phải coi như secret đã lộ và xoay (rotate) nó ngay.

Global gitignore

Một số thứ chỉ liên quan tới máy của riêng bạn — file của hệ điều hành (.DS_Store trên macOS) hay cấu hình editor (.idea/). Thay vì thêm vào từng repo, đặt chúng vào một gitignore toàn cục global gitignore:

# Khai báo file gitignore dùng chung cho mọi repo
git config --global core.excludesfile ~/.gitignore_global

Rồi thêm pattern vào ~/.gitignore_global. Cách này giữ .gitignore của dự án sạch, chỉ chứa thứ liên quan tới chính dự án.

Trọng tâm thi

.gitignore chỉ ngăn track file chưa được track. File đã commit cần git rm --cached để untrack. Pattern / đầu neo vào gốc repo, / cuối chỉ thư mục, ! tạo ngoại lệ.

Tóm tắt

  • .gitignore liệt kê pattern các file Git nên bỏ qua, không theo dõi.
  • Cú pháp: * khớp nhiều ký tự, / cuối là thư mục, / đầu neo gốc, ! tạo ngoại lệ.
  • File đã track không tự bị ignore — phải git rm --cached để gỡ (vẫn giữ trên đĩa).
  • Secret đã push thì phải xoay lại, không chỉ ignore.
  • core.excludesfile đặt một global gitignore cho file cá nhân/OS dùng chung mọi repo.