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 的驱动器上)
两者满足其一时,就会触发 类似如下的错误信息:
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
文件中找到这样两行:
[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