safe.directory 是什么
safe.directory 是 Git 2.35.2 起引入的保护机制:当仓库目录的属主与当前操作者不一致时,Git 默认拒绝操作并报 detected dubious ownership in repository。该限制用于防护高权限进程处理他人可控仓库的攻击面;容器、sudo、挂载盘与 CI 场景经常触发,用 safe.directory 逐目录显式放行。
基本信息
| 报错文案 | detected dubious ownership in repository |
|---|---|
| 逐条放行 | git config --global --add safe.directory /work/repo |
| 查看清单 | git config --get-all safe.directory |
| 通配放行 | safe.directory 星号写法会放行一切,风险高,慎用 |
典型使用场景
- 容器与宿主机共用工作目录:容器内以 root 克隆过,宿主机普通用户再操作
- sudo 执行过 git 命令:.git 属主仍是 root,切回普通用户直接报错
- 共享开发机或挂载盘:仓库目录属主是别人,但你只需只读查看
- 快照与备份还原:还原后目录属主可能变成执行还原的用户,需要批量放行
- CI 固定用户运行:工作目录由上一步骤以其他用户创建
常用示例
常用示例
git config --global --add safe.directory /work/app # 放行单个仓库路径
git config --global --get-all safe.directory # 列出已放行清单
git config --show-origin --get-all safe.directory # 顺带看配置来自哪个文件
git status # 验证不再报 dubious ownership放行写法对照
| 写法 | 含义 | 适用场景 |
|---|---|---|
| 具体路径 | 只放行该目录树 | 首选:范围最小、影响可控 |
| 星号通配 | 放行所有仓库 | 临时救急;不宜长期保留 |
| 双份路径 | 容器与主机各自配置实际路径 | 同一目录在两处路径不同 |
safe.directory 是信任声明而不是权限修复:放行后 Git 不再校验属主,但仓库内容是否可信仍要自行判断;能从属主层面解决时优先用 chown 修权限。
配置写在全局 ~/.gitconfig 时对当前用户所有仓库生效;团队可把路径加进 CI 初始化脚本,个人放行不要写进仓库级配置。清理放行项时先 --get-all 列出,再 --unset-all 后按需重新添加。