最近搭了一个 git server,为了节省资源,没有用 gitlab。
系统是 Ubuntu 20,之前用的 18 比较多,没有特别关注区别。
等都装好了,发现一个问题。
我的 git 仓库属主是 git 用户,属组是 git 组,然后我把另一个用户 tester 加入 git 组之后,发现 clone 总是失败。
提示错误如下:
fatal: detected dubious ownership in repository at '/srv/gitdir/testpkg.git'
To add an exception for this directory, call:
git config --global --add safe.directory /srv/gitdir/testpkg.git
但是如果我用属主 git 来操作,就没有问题。
用 AI 搜了一下解决方案,说是要在客户端机器运行上面提示的命令,但是问题依旧。
搞不明白为啥。
中间搁置了一段时间,然后今天有其他小伙伴也需要用 git,就必须要解决一下了。
最后查到一个方法说是在 git server 可以用下面的命令来测试权限:
sudo -u tester -g git bash -c "cd /srv/gitdir/testpkg.git && git log --oneline -3"
果然错误提示和客户端提示一样,就还是有权限问题。
这时候 AI 给了一个新的解决方案,我试了下确实可行,就是把前面在客户端操作的加入信任目录的命令,在服务端每个用户上执行一次,具体步骤记录如下:
#1、创建 gituser 用户
useradd gituser
#2、创建 gituser 的家目录
sudo mkdir -p /home/gituser
sudo chown gituser:gituser /home/gituser
sudo chmod 755 /home/gituser
#3、设置正确的 shell(如果需要)
sudo usermod -s /bin/bash gituser
#4、把用户加到 git 组
sudo usermod -a -G git gituser
#5、以 gituser 身份配置全局 safe.directory,注意目录最后面不要带/
sudo -u gituser git config --global --add safe.directory /srv/gitdir/testpkg.git
#5.1、或者为所有 git 组用户批量设置
for user in $(getent group git | cut -d: -f4 | tr ',' ' '); do
sudo -u $user git config --global --add safe.directory /srv/gitdir/testpkg.git 2>/dev/null || true
done
按照上面的一通操作后,果然可以了。
这个方案不好的地方就是,每个 git 工程,都需要额外加一次信任,目前还没找到全局加信任的方法,但是毕竟可以正常用了,就先这样。
这次问题解决的过程,给我的几个启发:
以上,希望对碰到类似问题的你,也能有所帮助。