[Note] Ignore file đã tracked và các tầng ignore trong Git

Post này dùng để note nhanh lại vì mấy lần cứ quên cú pháp, toàn phải google lại mất thời gian. Vấn đề muôn thuở: Sửa file package.json hoặc config ở local để chạy, nhưng git status hoặc trình quản lý file change của IDE lúc nào cũng list danh sách file change này ra, nhìn rất ngứa mắt, đôi khi lỡ tay git add . cái là ăn cám.

1. File đã push lên Server (Tracked) nhưng muốn sửa ở local

Vấn đề: .gitignore không có tác dụng với file đã được track. Nên dù có cố thêm vào .gitignore cũng không có tác dụng.

Giải pháp (dùng Skip Worktree):

Lệnh này bảo Git: “Tao sửa file này kệ tao, đừng báo change nữa, giữ nguyên cái trên remote cho tao.”

Ẩn file (ignore changes):

1
2
git update-index --skip-worktree <path-to-file>
# Ví dụ: git update-index --skip-worktree package.json

Hiện lại file (để commit):

1
git update-index --no-skip-worktree <path-to-file>

Check xem đang ẩn những file nào:

1
git ls-files -v | grep ^S

Note:

  • Dùng --skip-worktree (cho config/app settings) chứ không dùng --assume-unchanged (cái này cho performance/SDK).
  • skip-worktree an toàn hơn khi pull code mới, nó không tự tiện override local changes.

2. File chưa Track (untracked)

Chia và phân loại rõ ràng theo 3 level sau. Không phải cái gì cũng nhét vào .gitignore chung của dự án.

Level 1: Rác hệ thống/IDE - set ignore ở cấp độ global

Mấy file kiểu .DS_Store, .vscode/, Thumbs.db.

Set file:

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

Tạo file gitignore_global và thêm nội dung là cái file/folder cần ignore (y chan .gitignore).

Reset (nếu lỡ config sai):

1
git config --global --unset core.excludesFile

Level 2: Rác cá nhân trong dự án - ở cấp độ project, local repo

Ví dụ: file nháp, file appsettings.Local.json, sửa riêng trong repo này. Không muốn push lên và cũng không muốn sửa .gitignore chung (sợ conflict với team).

Giải pháp:

Sửa trực tiếp file: .git/info/exclude (nằm trong folder .git ẩn).
Cú pháp y hệt .gitignore.

Level 3: Rác dự án - ở cấp độ project và share chung cho team

File build, node_modules, .env. Cái này thì dùng .gitignore như bình thường.


Tóm tắt flow quyết định

  1. File đã có trên remote?
  • YES -> git update-index --skip-worktree
  • NO -> Xem tiếp
  1. File này team có cần không?
  • NO (Của riêng mình/OS) -> Global Config hoặc .git/info/exclude.
  • NO (Rác build) -> .gitignore.
  • YES -> Commit.

Xong, chỉ vậy thôi.

 Comments
Comment plugin failed to load
Loading comment plugin