WSL+samba+git: "error: insufficient permission for adding an object to repository database .git/objects" / git-clone / git-add permission errors
WSL+samba+git: "error: insufficient permission for adding an object to repository database .git/objects" / git-clone / git-add permission errors
我正在使用 WSL1(Windows Linux 子系统)和 Ubuntu 20.04.1 LTS 开发 Win10。我有一个 Samba (1.0) 网络共享,我想通过我的 Ubuntu 终端在上面创建我的 git 存储库。
christian@my_pc:~/p/git_test$ ll
total 2048
drwxr-xr-x 1 christian christian 512 Jan 19 11:13 ./
drwxr-xr-x 1 christian christian 512 Jan 19 10:11 ../
-rwxr--r-- 1 christian christian 0 Jan 19 10:12 my_code_file.rb
我可以 git init
没有问题,但是,当我尝试 git add
一个文件时,我得到这个错误:
christian@my_pc:~/p/git_test$ git add my_code_file.rb
error: insufficient permission for adding an object to repository database .git/objects
error: my_code_file.rb: failed to insert into database
error: unable to index file 'my_code_file.rb'
fatal: adding files failed
然而,据我所知,权限是正确的。所有文件都属于 christian:christian。树看起来像这样:
.git
├── [-rwxr--r--] HEAD
├── [drwxr-xr-x] branches
├── [-rwxr--r--] config
├── [-rwxr--r--] description
├── [drwxr-xr-x] hooks
│ ├── [-rwxr--r--] applypatch-msg.sample
│ ├── [-rwxr--r--] commit-msg.sample
│ ├── [-rwxr--r--] fsmonitor-watchman.sample
│ ├── [-rwxr--r--] post-update.sample
│ ├── [-rwxr--r--] pre-applypatch.sample
│ ├── [-rwxr--r--] pre-commit.sample
│ ├── [-rwxr--r--] pre-merge-commit.sample
│ ├── [-rwxr--r--] pre-push.sample
│ ├── [-rwxr--r--] pre-rebase.sample
│ ├── [-rwxr--r--] pre-receive.sample
│ ├── [-rwxr--r--] prepare-commit-msg.sample
│ └── [-rwxr--r--] update.sample
├── [drwxr-xr-x] info
│ └── [-rwxr--r--] exclude
├── [drwxr-xr-x] objects
│ ├── [drwxr-xr-x] e6
│ │ └── [-r-xr--r--] tmp_obj_mZzHwy
│ ├── [drwxr-xr-x] info
│ └── [drwxr-xr-x] pack
└── [drwxr-xr-x] refs
├── [drwxr-xr-x] heads
└── [drwxr-xr-x] tags
10 directories, 17 files
奇怪的是,在 git add my_code_file.rb
之后,我无法再删除 .git
目录,未经许可错误:
christian@my_pc:~/p/git_test$ rm -rf .git
rm: cannot remove '.git/objects/e6/tmp_obj_mZzHwy': Permission denied
似乎 git 创建了 tmp_obj_mZzHwy
而没有允许我删除它,我想这不应该。
git add my_code_file.rb
之后的 .git
文件夹的权限
christian@my_pc:~/p/git_test$ ls -lahR .git
.git:
total 0
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 .
drwxr-xr-x 1 christian christian 512 Jan 19 11:13 ..
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 objects
.git/objects:
total 0
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 .
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 ..
drwxr-xr-x 1 christian christian 512 Jan 19 11:13 e6
.git/objects/e6:
total 1.0M
drwxr-xr-x 1 christian christian 512 Jan 19 11:13 .
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 ..
-r-xr--r-- 1 christian christian 0 Jan 19 11:13 tmp_obj_mZzHwy
我正在使用的 Samba 共享在 Win10 上挂载为驱动器(带字母 P:)。在我的 WSL Ubuntu 上,我通过 /etc/fstab
使用以下行安装它:
P:▸ /mnt/p▸ drvfs▸defaults,metadata,rw,exec,uid=christian,gid=christian,umask=22,fmask=11▸0 0
我的 .git/config
回购
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
我已经尝试解决的问题:
chmod -R u+rwx .
git init --shared=all
umask 0000
在我的主目录(resp. 非 samba 驱动器)git init/add
工作没有问题。
更新
我发现 samba 共享没有正确挂载,元数据选项丢失 resp。 每当我安装它时都会被忽略。我认为这可能是问题所在!但是,我不清楚为什么它会被忽略,或者是否有 强制它的方法?
TARGET SOURCE FSTYPE OPTIONS
/ rootfs wslfs rw,noatime
...
├─/mnt/p P: drvfs rw,noatime,uid=1000,gid=1000,case=off
└─/mnt/c C:\ drvfs rw,noatime,uid=1000,gid=1000,metadata,case=off
解决方案:升级到 WSL2
据我所知,解决方案是 从 WSL1 升级到 WSL2,安装工作正常。我现在可以 git-add 或 git-clone 无需许可错误。
打开 PowerShell 查看当前版本:
PS C:\Users\christian> wsl -l -v
NAME STATE VERSION
* Ubuntu Stopped 1
万一它是 1 你可以升级它,但首先检查 WSL2 要求(为了安全起见)。
Upgrade Guide
摘自Guide/Steps我不得不做的事情:
- Check WSL2 Requirements Windows 高于特定版本。符合要求
- 下载并执行:WSL2 Linux kernel update package for x64 machines
- 启用Windows虚拟机平台功能:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
- 重启
- 将您的发行版升级到 WSL2:打开 Powershell 并输入
wsl --set-version <distribution name> <versionNumber>
,在我的例子中是 wsl --set-version Ubuntu 2
。要查看您的发行版名称,请键入 wsl -l -v
- 使用
wsl -l -v
验证升级
只是为了提供完整的信息,这里还有挂载选项/etc/fstab
P: /mnt/p drvfs rw,noatime,uid=christian,gid=christian,metadata,case=off 0 0
与
相比
christian@my_pc:~$ findmnts
...
├─/mnt/p P: 9p rw,noatime,dirsync,aname=drvfs;path=P:;uid=1000;gid=1000;metadata;case=off;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=3,wfd=3
└─/mnt/c C:\ 9p rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;uid=1000;gid=1000;metadata;case=off;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=8,wfd=8
我正在使用 WSL1(Windows Linux 子系统)和 Ubuntu 20.04.1 LTS 开发 Win10。我有一个 Samba (1.0) 网络共享,我想通过我的 Ubuntu 终端在上面创建我的 git 存储库。
christian@my_pc:~/p/git_test$ ll
total 2048
drwxr-xr-x 1 christian christian 512 Jan 19 11:13 ./
drwxr-xr-x 1 christian christian 512 Jan 19 10:11 ../
-rwxr--r-- 1 christian christian 0 Jan 19 10:12 my_code_file.rb
我可以 git init
没有问题,但是,当我尝试 git add
一个文件时,我得到这个错误:
christian@my_pc:~/p/git_test$ git add my_code_file.rb
error: insufficient permission for adding an object to repository database .git/objects
error: my_code_file.rb: failed to insert into database
error: unable to index file 'my_code_file.rb'
fatal: adding files failed
然而,据我所知,权限是正确的。所有文件都属于 christian:christian。树看起来像这样:
.git
├── [-rwxr--r--] HEAD
├── [drwxr-xr-x] branches
├── [-rwxr--r--] config
├── [-rwxr--r--] description
├── [drwxr-xr-x] hooks
│ ├── [-rwxr--r--] applypatch-msg.sample
│ ├── [-rwxr--r--] commit-msg.sample
│ ├── [-rwxr--r--] fsmonitor-watchman.sample
│ ├── [-rwxr--r--] post-update.sample
│ ├── [-rwxr--r--] pre-applypatch.sample
│ ├── [-rwxr--r--] pre-commit.sample
│ ├── [-rwxr--r--] pre-merge-commit.sample
│ ├── [-rwxr--r--] pre-push.sample
│ ├── [-rwxr--r--] pre-rebase.sample
│ ├── [-rwxr--r--] pre-receive.sample
│ ├── [-rwxr--r--] prepare-commit-msg.sample
│ └── [-rwxr--r--] update.sample
├── [drwxr-xr-x] info
│ └── [-rwxr--r--] exclude
├── [drwxr-xr-x] objects
│ ├── [drwxr-xr-x] e6
│ │ └── [-r-xr--r--] tmp_obj_mZzHwy
│ ├── [drwxr-xr-x] info
│ └── [drwxr-xr-x] pack
└── [drwxr-xr-x] refs
├── [drwxr-xr-x] heads
└── [drwxr-xr-x] tags
10 directories, 17 files
奇怪的是,在 git add my_code_file.rb
之后,我无法再删除 .git
目录,未经许可错误:
christian@my_pc:~/p/git_test$ rm -rf .git
rm: cannot remove '.git/objects/e6/tmp_obj_mZzHwy': Permission denied
似乎 git 创建了 tmp_obj_mZzHwy
而没有允许我删除它,我想这不应该。
git add my_code_file.rb
.git
文件夹的权限
christian@my_pc:~/p/git_test$ ls -lahR .git
.git:
total 0
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 .
drwxr-xr-x 1 christian christian 512 Jan 19 11:13 ..
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 objects
.git/objects:
total 0
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 .
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 ..
drwxr-xr-x 1 christian christian 512 Jan 19 11:13 e6
.git/objects/e6:
total 1.0M
drwxr-xr-x 1 christian christian 512 Jan 19 11:13 .
drwxr-xr-x 1 christian christian 512 Jan 19 11:14 ..
-r-xr--r-- 1 christian christian 0 Jan 19 11:13 tmp_obj_mZzHwy
我正在使用的 Samba 共享在 Win10 上挂载为驱动器(带字母 P:)。在我的 WSL Ubuntu 上,我通过 /etc/fstab
使用以下行安装它:
P:▸ /mnt/p▸ drvfs▸defaults,metadata,rw,exec,uid=christian,gid=christian,umask=22,fmask=11▸0 0
我的 .git/config
回购
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
我已经尝试解决的问题:
chmod -R u+rwx .
git init --shared=all
umask 0000
在我的主目录(resp. 非 samba 驱动器)git init/add
工作没有问题。
更新
我发现 samba 共享没有正确挂载,元数据选项丢失 resp。 每当我安装它时都会被忽略。我认为这可能是问题所在!但是,我不清楚为什么它会被忽略,或者是否有 强制它的方法?
TARGET SOURCE FSTYPE OPTIONS
/ rootfs wslfs rw,noatime
...
├─/mnt/p P: drvfs rw,noatime,uid=1000,gid=1000,case=off
└─/mnt/c C:\ drvfs rw,noatime,uid=1000,gid=1000,metadata,case=off
解决方案:升级到 WSL2
据我所知,解决方案是 从 WSL1 升级到 WSL2,安装工作正常。我现在可以 git-add 或 git-clone 无需许可错误。
打开 PowerShell 查看当前版本:
PS C:\Users\christian> wsl -l -v
NAME STATE VERSION
* Ubuntu Stopped 1
万一它是 1 你可以升级它,但首先检查 WSL2 要求(为了安全起见)。
Upgrade Guide
摘自Guide/Steps我不得不做的事情:
- Check WSL2 Requirements Windows 高于特定版本。符合要求
- 下载并执行:WSL2 Linux kernel update package for x64 machines
- 启用Windows虚拟机平台功能:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
- 重启
- 将您的发行版升级到 WSL2:打开 Powershell 并输入
wsl --set-version <distribution name> <versionNumber>
,在我的例子中是wsl --set-version Ubuntu 2
。要查看您的发行版名称,请键入wsl -l -v
- 使用
wsl -l -v
验证升级
只是为了提供完整的信息,这里还有挂载选项/etc/fstab
P: /mnt/p drvfs rw,noatime,uid=christian,gid=christian,metadata,case=off 0 0
与
相比christian@my_pc:~$ findmnts
...
├─/mnt/p P: 9p rw,noatime,dirsync,aname=drvfs;path=P:;uid=1000;gid=1000;metadata;case=off;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=3,wfd=3
└─/mnt/c C:\ 9p rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;uid=1000;gid=1000;metadata;case=off;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=8,wfd=8