客户端开发
Flutter 报 Unable to find git in your PATH 与 Git safe.directory 所有权校验
Android Studio 报 device daemon exited、命令行误报找不到 git,实为 SDK 或仓库目录触发 Git 2.35+ safe.directory 所有权拦截的合并排查笔记。
在 Windows 上重装系统、跨磁盘拷贝旧目录或混用管理员与普通权限终端后,Git 仓库的所有权校验常表现为两种现象:一种是直接运行 Git 时给出明确的 dubious ownership 提示,另一种则是上层工具脚本忽略了原始错误输出,转而报出不准确的环境错误。
1. 错误提示表象:Flutter device daemon exited 与 Unable to find git
在 Android Studio(Windows 11)中打开 Flutter 项目准备调试时,设备下拉列表无法加载,底部持续提示:
Flutter device daemon #1 exited (exit code 1)
IDE 弹窗同时给出了怀疑达到 Windows 最大文件句柄数限制的提示(附带 increase maximum file handles Windows 11.0 检索建议),但核对系统状态后确认与句柄数无关。
转到 PowerShell 直接运行 flutter doctor 查看原始输出,看到的报错变成了:
PS> flutter doctor
Error: Unable to find git in your PATH.
此时检查环境变量可以确认 Git 已经在 PATH 中,单独执行 git --version 也能正常返回版本号,重启 IDE 同样无效。
真正的原因需要直接切进 Flutter SDK 所在目录执行一次 git status 才能看到(相关背景见 flutter/flutter#137308):flutter.bat 启动时会先在 SDK 自身的 Git 仓库中调用 Git 检查版本状态;当该目录触发 Git 安全拦截返回非零退出码时,早期启动脚本没有区分“找不到可执行文件”和“Git 拒绝在当前仓库执行”,统一输出了 Unable to find git in your PATH。
2. 底层拦截机制:Git 2.35.2+ 的 dubious ownership
直接在受影响目录执行 git status(或运行底层会调用 Git 读取元数据的构建命令)时,终端输出的原始报错如下:
fatal: detected dubious ownership in repository at '/path/to/repository'
'/path/to/repository' is owned by:
<repository owner info>
but the current user is:
<current user info>
To add an exception for this directory, call:
git config --global --add safe.directory /path/to/repository
这是 Git 2.35.2 引入的默认安全限制:当运行 Git 的当前系统账户与目录记录的所有者不一致时,Git 会拒绝执行命令,防止在多用户共享目录中误触发他人配置的 .git/config 或钩子脚本。
在个人开发机上触发该拦截,通常来自以下三种场景:
- 重装 Windows 系统后,非系统盘上的 Flutter SDK 或历史代码目录仍保留着旧系统账户的 SID;
- 从移动硬盘或其他设备直接复制过来的本地仓库;
- 拉取或解压目录时使用了管理员权限终端,日常开发切换回了普通权限终端。
3. 处理方式与适用边界
确认目标目录属于自己维护的可信路径后,可按影响范围选择处理方式:
- 仅单个 SDK 或单个仓库受影响:将该路径加入全局安全目录白名单即可:
git config --global --add safe.directory <flutter-sdk-or-repo-path>
- 重装系统后整块代码盘下的仓库普遍报错:逐个添加
safe.directory较为繁琐,直接把父目录的所有者改回当前账户更彻底:- Windows:右键代码盘根目录 → 属性 → 安全 → 高级,将顶部的「所有者」改为当前登录账户,勾选「替换子容器和对象的所有者」后应用。
- WSL / Linux:使用
chown修正目录归属:
sudo chown -R $(whoami) /path/to/workspace
变更完成后,先在目标目录执行 git status 确认不再报错,再重新运行 flutter doctor,命令行与 Android Studio 的 device daemon 即可恢复正常。