📌 场景
开发中经常遇到这种情况:项目里有个数据库文件(比如 app.db)或者配置文件,本地不想每次都提交 ,但服务器上需要正常跟踪。
常见的错误做法是加到 .gitignore ------ 但 .gitignore 会被提交到仓库,所有环境都会忽略这个文件,包括你的服务器。
✅ 正确做法:--assume-unchanged
bash
git update-index --assume-unchanged data/app.db
一条命令搞定。效果:
| 环境 | 行为 |
|---|---|
| 🖥️ 本地 | Git 假装这个文件没有变化,git status 不显示,git add . 不会提交 |
| ☁️ 服务器 | 完全不受影响,正常跟踪、正常提交 |
🔑 原理
--assume-unchanged 是一个本地索引标记 ,只存在于当前机器的 .git 目录中,不会推送到远程仓库。所以每台机器可以独立决定要不要忽略某个文件的变更。
🔄 恢复跟踪
哪天想恢复?加个 --no:
bash
git update-index --no-assume-unchanged data/app.db
📋 查看哪些文件被标记了
bash
git ls-files -v | findstr "^h"
小写
h开头的就是被assume-unchanged标记的文件(Linux/Mac 用grep替代findstr)。
⚠️ 注意事项
git pull有冲突时会失效 ------ 如果远程修改了这个文件,拉取时 Git 会提示冲突,需要先取消标记再处理git stash和git reset --hard不受影响 ------ 这些操作会忽略标记,直接覆盖文件- 换一台电脑需要重新标记 ------ 这是本地设置,clone 新仓库后要重新运行
🆚 和 .gitignore 的区别
.gitignore |
--assume-unchanged |
|
|---|---|---|
| 作用范围 | 所有环境(会被提交) | 仅当前机器 |
| 适用场景 | 不需要跟踪的文件(如 node_modules) |
已跟踪但本地不想提交变更的文件 |
| 对已跟踪文件有效? | ❌ 无效 | ✅ 有效 |
一句话总结:想全局忽略用 .gitignore,想本地偷懒用 --assume-unchanged。