小编典典

Git Push 错误:将对象添加到存储库数据库的权限不足

all

当我尝试推送到共享的 git 远程时,我收到以下错误: insufficient permission for adding an object to repository database

然后我在这里读到了一个修复:修复
这适用于下一次推送,因为所有文件都属于正确的组,但是下次有人推送更改时,它会在对象文件夹中创建一个具有默认组的新项目作为组。我能想到的唯一一件事就是更改所有开发人员签入项目的默认组,但这似乎是一种黑客行为。有任何想法吗?谢谢。


阅读 138

收藏
2022-03-03

共1个答案

小编典典

维修权限

确定并修复根本原因后(见下文),您需要修复权限:

cd /path/to/repo.git
sudo chgrp -R groupname .
sudo chmod -R g+rwX .
sudo find . -type d -exec chmod g+s '{}' +

请注意,如果您希望每个人都能够修改存储库,则不需要chgrp并且您需要将 chmod 更改为sudo chmod -R a+rwX .

如果您不解决根本原因,错误将不断出现,您将不得不一遍又一遍地重新运行上述命令。

根本原因

该错误可能由以下原因之一引起:

  • 存储库未配置为共享存储库(参见 参考资料core.sharedRepositorygit help config。如果输出:
     git config core.sharedRepository
    

is not groupor trueor or 1or some mask,尝试运行:

     git config core.sharedRepository group

然后重新运行递归chmodchgrp(参见上面的“修复权限”)。

  • 操作系统不会将目录上的 setgid 位解释为“所有新文件和子目录都应继承组所有者”。

core.sharedRepositorytruegroup时,Git 依赖 GNU 操作系统(例如,每个 Linux
发行版)的特性来确保新创建的子目录归正确的组(所有存储库用户所在的组)所有。此功能记录在GNU coreutils
文档
中:

… [如果] 设置了目录的 set-group-ID 位,则新创建的子文件继承与目录相同的组,新创建的子目录继承父目录的 set-group-ID
位。… [此机制让] 用户通过减少使用chmodchown共享新文件的需要更轻松地共享文件。

然而,并不是所有的操作系​​统都有这个特性(NetBSD 就是一个例子)。对于这些操作系统,您应该确保所有 Git
用户都具有相同的默认组。或者,您可以通过运行使存储库在世界范围内可写git config core.sharedRepository world(但要小心——他的安全性较低)。

  • 文件系统不支持 setgid 位(例如,FAT)。ext2、ext3、ext4 都支持 setgid 位。据我所知,不支持 setgid 位的文件系统也不支持组所有权的概念,因此所有文件和目录无论如何都将归同一个组所有(哪个组是挂载选项)。在这种情况下,请确保所有 Git 用户都在拥有文件系统中所有文件的组中。

  • 并非所有 Git 用户都在拥有存储库目录的同一组中。确保目录上的组所有者正确并且所有用户都在该组中。

2022-03-03