WSL Ubuntu发行版 | 如何解决克隆存储库时出现“操作不允许”的问题

我正在运行的是Ubuntu 18.04,作为Windows的子系统。我在多台电脑上都这样做过,从来没有遇到过这个问题。我尝试执行git clone <repo>,但出现了以下错误:
Cloning into '<repo>'...
error: chmod on /mnt/c/Users/Efsta/Code/<repo>/.git/config.lock failed: Operation not permitted
fatal: could not set 'core.filemode' to 'false'

我尝试了以下方法:

  1. ❯ git config core.fileMode false,结果如下:fatal: not in a git directory

  2. ❯ git config --global core.filemode false

  3. ❯ git config --add --global core.filemode false

似乎没有任何方法奏效。我已经尝试了这里的一些答案,但WSL似乎有点棘手。有人知道如何解决这个问题吗?

我还尝试了这个问题中的所有方法:https://stackoverflow.com/questions/1580596/how-do-i-make-git-ignore-file-mode-chmod-changes,但似乎都不起作用。

4个回答

我遇到了同样的问题。尝试这个:
sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata

将驱动器字母更改为与您遇到问题的那个驱动器字母。

5命令执行成功,但对我来说问题并未改变。当git尝试chmod .git/config.lock时,我仍然看到"操作不允许"的提示。 - akohlsmith
6对我来说起作用。微软为什么在自动挂载Windows位置时不这样做呢?是否有某种原因? - UpTheCreek
5请注意,此功能仅适用于构建版本17063之后: https://docs.microsoft.com/zh-cn/windows/wsl/release-notes#build-17063 - pooya13
这对我目前来说是有效的 - hoaphumanoid
1确认这个方法解决了我的问题 - 我不得不将目录从Windows文件系统更改为Ubuntu,以使卸载命令生效,但在运行命令后,我能够无权限问题地git clone我的存储库。 - epikhighs
这在Windows 10 2004中的WSL 2上有效。 - a.s.t.r.o
7应该是被接受的答案。 - Jonas Sourlier
1我正在使用WSL2,这与@akohlsmith的情况不同。然而,我发现以普通用户身份挂载可以解决问题:sudo mount -t drvfs C:\\folderVolume /mnt/folderVolume -o metadata uid=1000,gid=1000,umask=22,fmask=111。现在我可以无障碍地使用chmod了。 - Valorad
给我解决了问题! - elkarrde
真是救了我的一天,非常感谢你。不知为何,在我遇到的特定问题上找不到任何相关信息,但我开始查看类似问题,最终偶然发现了这个!真是太幸运了 :) - RAM237
@Valorad在他们的评论中提到了正确的补充 - 添加uid和gid是必要的,以避免文件的所有者为root。请注意,在metadata和uid选项之间需要加上逗号。 - Kevin Shea

你可以在WSL下使用元数据选项自动挂载Windows驱动器,这样应用程序(如git)就可以使用chmod来解决此问题。
编辑/etc/wsl.conf文件(如果不存在则创建)。 添加以下内容:
[automount]
options = "metadata"

然后,选择以下其中一种操作:
- 重新启动Windows。 - 退出所有WSL会话,在PowerShell或CMD中运行wsl --shutdown命令,然后再次启动WSL。 - 退出当前的会话,使用wsl --terminate <distroName>命令终止它,然后再次启动。
然后,您就不用再担心了。

1谢谢!这个方法对我有用,结合重新挂载驱动器。 - Alex
2我在做完这个之后不得不重新启动我的电脑。 - Andrew Koster
7不必重新启动,使用WSL 2,您可以退出所有的WSL 2 shell,然后从powershell运行wsl --shutdown。当您启动一个新的WSL shell时,它将自动使用您的新配置再次启动底层虚拟机。 - xxpor
这非常有帮助,谢谢! - RAM237
我们需要的救星!谢谢 :) - BelgoCanadian
刚刚在WSL2上做了这个,而且成功了。通过PowerShell关闭WSL2,无需重新启动。 - Big Rich
工作得很顺利,应该被接受为答案。 - Mladen Oršolić
对我来说也很有效。非常理想,因为我经常需要生成PDF和ZIP文件以通过网络表单上传。 - user643722

/mnt/c/Users/...位于Windows NTFS分区本身,而不是在WSL的ext4格式化的系统内部。因此,您必须将其视为实际Ubuntu安装中USB存储设备上的NTFS分区,并接受NTFS的限制。

NTFS分区不支持chmod或类似的Linux权限命令,与实际的Ubuntu安装不同,它不会出错,但也不会进行任何权限更改,WSL不会将此信息传递回给您,只会像您在这里看到的那样报错。

由于Linux权限模式和chmod无法正常工作,您无法在WSL的/mnt/c/...空间中正常执行git clone操作。这是WSL当前形式下的限制。


4好的,让我确认一些事情。微软表示,我应该在Windows中使用WSL进行开发,这样我就可以在WSL和Windows两边进行修改。所以,直到现在,我在其他安装中都是这样做的。如果我们假设你所说的是正确的,那么你会推荐什么解决方案来解决我的问题呢? - Dimitris Efst
还有一个问题要补充。关于SSH,我该怎么办?我可以在两者上重复使用同一密钥吗?有些情况下,比如在使用gcloud时,我想要使用我的Windows开发环境代替... - Dimitris Efst
之前我用的是WLinux,速度很慢,但它使用了与Windows文件系统相同的基本理论,所以我也能做到。所以,并不是特定于Ubuntu的事情。对不起打扰你了。 - Dimitris Efst
@DimitrisEfst 你应该使用WSL内置的Linux分区,而不是/mnt/c/Users/...或类似的路径。这又是WSL的一个限制。(也就是说,使用存储在Ubuntu WSL中的/home/USER/...目录来进行*nix权限和复制构建的二进制文件等操作,然后将其复制到/mnt/c/Users/...中以在Windows本机环境中使用。)(需要注意的是,WSL有很多限制,请记住这一点) - Thomas Ward
10这个答案在写下时可能是准确的,但现在不再是准确的。我经常将仓库从 WSL 克隆到 /mnt/c/,没有任何问题,并且克隆到 /mnt/c/ 相比克隆到 ~/. 有明显的可用性优势。请参考 Wojtek 的答案。 - Justin
@Justin,老实说,我觉得那时候它甚至都不准确。自2019年以来,我一直在Windows 10上使用git在/mnt/c中进行克隆,而且一直都很顺利。最近我在另一台Win 11电脑上遇到了这个问题,所以我来这里寻求帮助,但最终还是成功解决了。 - user206904

我遇到了同样的问题。我的解决方案是在默认的WSL位置克隆我的仓库(它有效),然后使用Visual Studio Code远程访问我的WSL仓库。这样你就不必使用/mnt/c了。
链接: https://code.visualstudio.com/docs/remote/wsl