Windows 下 git 仓库 dubious ownership 所有权问题

fatal: detected dubious ownership in repository at 'path/to/your/repo'

如果你在 Windows 上切换过用户或者重装过系统，那么再重新打开 D 盘上的 git 仓库；或者打开 U 盘或者双系统中其他系统分区的 Git 仓库时，可能遇到过这样的 dubious ownership 报错。虽然 Git 给出了将路径添加到 safe.directory 的解决方法，但是有没有方法直接修改这个 Git 仓库的所有权呢？

本文以我在 记一个围棋程序的制作过程 一文中提到的仓库为例，记录如何解决这个 Git 仓库所有权问题。

问题简述

目前看来，这个问题只会在 Windows 下触发，同时还需要比较新的 Git 版本。

触发方法很简单，有两种情况：

运行 Git 命令的用户和当时创建文件夹的用户不同时。

Git 仓库位于非 Windows 管理的文件系统上，比如用 Windows 版本的 Git 访问 U 盘上、wsl 里或者双启动的其他系统驱动器上的 Git 仓库时。（大多数情况下就是指 repo 位于非 NTFS 的驱动器上）

两者满足其一时，就会触发 类似如下的错误信息：

Copy
fatal: detected dubious ownership in repository at 'D:/Projects/StupidGo'
'D:/Projects/StupidGo' is owned by:
'S-1-5-21-0000000000-0000000000-25500068-1001'
but the current user is:
'S-1-5-21-0000000000-0000000000-1346710304-1001'
To add an exception for this directory, call:

git config --global --add safe.directory D:/Projects/StupidGo

错误信息给出了一种解决方法，即将该目录添加进 Git 的 safe.directory 属性中，如果这么干了，就可以在 ~/.gitconfig 文件中找到这样两行：

Copy
[safe]
directory = D:/Projects/StupidGo

如果你是由于第二个原因触发的报错，那么这就是最好的方案了，但是你还可以往下看一看我为什么这么说；
如果是由于第一个原因的话，这样并没有从根源上解决问题：Git 报错的原因是该文件夹不是当前用户创建的，但是实际上这个 Git 仓库就是我的，只不过我换了个马甲而已。从根源上来说，解决方法应该是更改这个 repo 的所有者。

但是，Git 并不会在 .git 文件夹中存储所有者相关的信息，Windows 版的 Git 又是如何捕捉到这个安全问题的呢？

实际上，Git 查看了 Windows 的文件夹所有者信息，如果和目前用户不符，就会开始抱怨。而在不由 Windows 管理的文件系统中，并没有 “文件夹所有者” 这一属性，所以也会报错。

由此可见，这个问题的解决不是从 Git 入手，而是从 Windows 的文件夹入手。

解决方法

打开 Git 仓库文件夹的属性，点击 “安全” 选项卡，再点击 “高级”。

在弹出的窗口中，靠上的部分有一栏，叫 “所有者”，在它的后面有一个 “更改” 按钮，点击它。

在输入框内填入自己的用户名（User 文件夹的名字），然后点击检查名称，会自动补全为 机器名称/用户名的形式，比如我的是 CHRIS_ROG_M16\chris，然后点确定。

回到上一界面，将新出现的 “替换自容器和对象的所有者” 单选框勾上，再点确认，即可。

在全部完成后，所有者应该变为了目前用户（如果目前用户登录了微软账号，则会显示微软账号的姓名和邮箱）

参考资料

permissions - How to change ownership of a local GIT repository on Windows 11 - Stack Overflow