科技 · 实用指南
Git 提示“detected dubious ownership”:添加 safe.directory 前先核所有权边界
把致命报错当作身份不一致,而不是碍眼警告。先核 Git 进程用户、仓库所有者、挂载路径和配置作用域,再决定是否只对一个精确路径放行。

当工作树属于另一身份时,Git 默认拒绝读取该仓库配置,除非该路径被明确设为可信。安全做法是先证明谁在运行 Git、规范路径属于谁;意外所有权要修正,确实共享时才只加一个精确例外。
1. 记录失败身份与规范路径
必须在真正失败的同一 shell、服务、容器或 CI 步骤中复现。记录有效用户、Git 报出的精确路径和规范工作树路径。在类 Unix 系统比较 id -u、id -g 与仓库及每级父目录的所有者;Windows 则在同一 Git 客户端上下文检查所有者 SID。不要假定交互终端、GUI、sudo、服务和容器共享同一身份或配置文件。
2. 改动前先分类
有三类不同问题:恢复、管理员克隆、迁盘或 root 构建造成的意外错误所有者,应修正所有者或改用目标用户;多人共享导致的有意不同所有者,应保留所有者并只建精确例外;文件系统边界回报错误或抖动元数据时,应重复取证,并测试把仓库放在挂载点下一层或改挂父目录,不能立刻把信任配置当根因。
3. 确认失败进程实际读取的配置
--global 写入的是执行该命令用户的配置;另一服务账号、容器用户或 CI 进程可能读取完全不同的 HOME。应在失败上下文运行 git config --show-origin --get-all safe.directory,查看有效值及来源文件。只有管理员明确制定整机策略时才用 system 作用域。该项只从受保护配置生效,仓库不能在本地配置里把自己标成安全。
4. 采取最窄修复
若所有者是意外的,只把仓库树改回目标账号并验证,不要递归放宽无关父目录权限。若共享是有意的,就为实际运行 Git 的身份添加规范仓库路径这一项,并按当前 shell 正确引用。避免通配符 *:Git 明确说明它会完全退出检查、把所有仓库视为安全。路径末尾 /* 也会信任其下全部仓库,只适合受控共享根目录。
5. 以原操作复测,并覆盖嵌套仓库
用原进程用户重跑 git status 和最初失败命令,再分别检查子模块、worktree 或嵌套仓库,因为它们可能跨越另一所有权边界。若测试不小心以 root 或另一 HOME 运行,即使成功也无效;再次确认有效身份和 show-origin 输出。单一路径工作后,删除过期或通配符项,并简要记录为何信任该共享所有权。
为什么不能轻视这条警告
所有权遍历规则源于 CVE-2022-24765。GitHub 说明,多用户系统上的攻击者可在父级放置 .git,使 Git 读取可能触发命令的配置。现代 Git 因此在发现过程跨越所有权边界时停止,除非路径被明确信任。正确问题不是“怎样消掉提示”,而是“谁拥有路径、为何合理、例外能缩到多小”。
