微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WSL+samba+git:“错误:将对象添加到存储库数据库 .git/objects 的权限不足”/git-clone/git-add 权限错误

如何解决WSL+samba+git:“错误:将对象添加到存储库数据库 .git/objects 的权限不足”/git-clone/git-add 权限错误

我正在使用 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 之后的 git add my_code_file.rb 文件夹的权限

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 Share 在 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

在我的主目录(或非 samba 驱动器)上,git init/add 可以正常工作。


更新

我发现 samba 共享没有正确安装,元数据选项丢失。每当我安装它时被忽略。我想这可能是问题所在!但是,我不清楚,为什么它会被忽略或者是否有强制它的方法

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,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

摘自指南/我必须做的步骤:

  • 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,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,aname=drvfs;path=C:\;uid=1000;gid=1000;uid=1000;gid=1000;metadata;case=off;symlinkroot=/mnt/,rfd=8,wfd=8

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?