我已经使用克隆在 Samba 共享上的 git 存储库大约一年了,除了设置时遇到的几个问题外,没有出现任何问题。最近,我尝试将一些文件添加到现有存储库,却惊讶地看到“权限被拒绝”错误。
现在我可以初始化空的 repo,但是当我尝试运行时strace git add test
,我得到:
open(".git/objects/info/alternates", O_RDONLY|O_NOATIME) = -1 ENOENT (No such file or directory)
access(".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", F_OK) = -1 ENOENT (No such file or directory)
open(".git/objects/e6/tmp_obj_GvIyn7", O_RDWR|O_CREAT|O_EXCL, 0444) = -1 EACCES (Permission denied)
write(2, "error: insufficient permission f"..., 88error: insufficient permission for adding an object to repository database .git/objects
) = 88
close(4) = 0
write(2, "error: test: failed to insert in"..., 44error: test: failed to insert into database
) = 44
write(2, "error: unable to index file test"..., 33error: unable to index file test
) = 33
我在 64 位 Archlinux 上使用 git 1.8.4.2、samba 4.1.1(内核版本:3.12.1)。我很久以来就没有在 git 和 samba 配置中做过任何更改。
使用 /etc/fstab 中的 systemd 自动挂载来挂载共享:
//SERVER/DATA /media/smb cifs user,noauto,credentials=/etc/samba/creds,\
workgroup=PRV,uid=1000,gid=users,_netdev,comment=systemd.automount 0 0
mount 显示为:
//SERVER/DATA on /media/smb type cifs (rw,nosuid,nodev,noexec,relatime,vers=1.0,
cache=strict,domain=PRV,uid=1000,forceuid,gid=100,forcegid,addr=10.1.1.5,
file_mode=0755,dir_mode=0755,nounix,serverino,rsize=61440,wsize=65536,actimeo=1)
权限:
$ ls -lan .git/objects
total 0
drwxr-xr-x 2 1000 100 0 11-27 09:04 .
drwxr-xr-x 2 1000 100 0 2013-11-27 ..
drwxr-xr-x 2 1000 100 0 11-27 09:39 e6
drwxr-xr-x 2 1000 100 0 11-27 09:04 info
drwxr-xr-x 2 1000 100 0 11-27 09:04 pack
$ ls -lan .git/objects/pack
total 0
drwxr-xr-x 2 1000 100 0 11-27 09:04 .
drwxr-xr-x 2 1000 100 0 11-27 09:04 ..
我已经尝试过了:
- 设置共享的不同权限-相同的结果
- 手动安装-相同
- 将 samba 和 git 降级到早期版本 - 没有区别
- sudo - 这个方法可行,但除非绝对必要,否则我不会使用它
- mercurial(出于好奇) - 克隆 git repo 失败,克隆 hg repos 没有任何问题
- 使用 sudo 后更改所有者和组 - 它们似乎在发出命令之前和之后保持不变
我还能做些什么来调试它吗?我很倾向于继续使用 git,但我不知道权限出了什么问题。
关于 sudo:
$ touch test
$ sudo strace git add test
open(".git/objects/info/alternates", O_RDONLY|O_NOATIME) = -1 ENOENT (No such file or directory)
access(".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, ".git/objects/pack", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
getdents(5, /* 2 entries */, 32768) = 48
getdents(5, /* 0 entries */, 32768) = 0
close(5) = 0
open(".git/objects/e6/tmp_obj_i4e0C8", O_RDWR|O_CREAT|O_EXCL, 0444) = 5
brk(0xd5a000) = 0xd5a000
write(5, "x\1K\312\311OR0`\0\0\t\260\1\360", 15) = 15
brk(0xd4a000) = 0xd4a000
brk(0xd3a000) = 0xd3a000
close(5) = 0
link(".git/objects/e6/tmp_obj_i4e0C8", ".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391") = 0
unlink(".git/objects/e6/tmp_obj_i4e0C8") = 0
lstat(".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", {st_mode=S_IFREG|0755, st_size=15, ...}) = 0
close(4)
$ ls -lan .git/objects/e6
total 1
drwxr-xr-x 2 1000 100 0 11-28 10:11 .
drwxr-xr-x 2 1000 100 0 11-28 10:10 ..
-rwxr-xr-x 1 1000 100 15 11-28 10:11 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
-r-xr-xr-x 1 1000 100 0 11-28 10:11 tmp_obj_9Z8UgU
-r-xr-xr-x 1 1000 100 0 11-28 10:10 tmp_obj_d0yhDJ
它创建具有权限的对象0755
。没有sudo
临时对象文件则留下0555
。看起来问题出在以0444
普通用户身份创建文件时,这似乎对整个 repo 有写权限。
答案1
最有可能的是,您在 root 身份下对此 repo 进行了更改,可能是由于使用sudo
,现在 中的某些文件.git
归 root 所有。执行 将chown
文件所有权重置为您通常使用的用户。
答案2
这是 3.12 中的一个内核错误:https://bugzilla.kernel.org/show_bug.cgi?id=66251
按照@bjauy 所说降级或升级到 3.13。
答案3
我运行的内核版本中有一个错误。我已将内核降级到 3.11.6,然后git add/commit
用户就可以重新开始工作了。
答案4
您的 smb 文件夹在 Linux 中被视为“其他”组。因此,如果您希望所有组都可以写入您的 www,您的权限应该是 xx7,例如 777。
问题是,每次 git 创建新文件夹、文件或其他内容时,它都会使用自己的权限来创建它。解决方案是使用 umask,这样以当前用户名义创建的所有内容都将使用指定的权限。在这种情况下,Windows 共享文件夹,您将需要以下内容:
umask 000
因此任何新文件都可以被所有人写入,包括“其他”组,这就是您的共享 Windows 文件夹。
在你的.bashrc中添加这个umask,问题就解决了。