当我尝试推到共享git远程时,我得到以下错误: 向存储库数据库添加对象权限不足

这适用于下一次推送,因为所有的文件都属于正确的组,但下一次有人推送一个更改时,它会在对象文件夹中创建一个新项目,该项目的默认组为组。我唯一能想到的就是改变所有开发人员签入项目的默认组,但这似乎是一种hack。什么好主意吗?谢谢。


当前回答

使用下面的命令,就像魔术一样

sudo chown -R "${USER:-$(id -un)}" .

准确地输入命令(在结尾有额外的空格和一个点)

命令分解

sudo

以root用户运行

chown

改变所有权

-R

针对所有文件和文件夹的递归操作

"${USER:-$(id -un)}"

从$ user中获取用户名,如果没有设置,则通过运行id -un获取值

.

定位当前目录

其他回答

我通过使用ssh://基于URL而不是基于http://的URL解决了这个问题。

几天前,我使用基于http://的URL克隆了存储库。在克隆和推送之间,我不得不在我的帐户上启用2FA,随后将我的公钥添加到代码库中。

由于启用了2FA, http:// URL无法正常工作。

使用下面的命令,就像魔术一样

sudo chown -R "${USER:-$(id -un)}" .

准确地输入命令(在结尾有额外的空格和一个点)

命令分解

sudo

以root用户运行

chown

改变所有权

-R

针对所有文件和文件夹的递归操作

"${USER:-$(id -un)}"

从$ user中获取用户名,如果没有设置,则通过运行id -un获取值

.

定位当前目录

如果您使用不同的用户运行git init,而不是您计划在推送更改时使用的用户,则很容易发生这种情况。

如果你盲目地遵循[1]上的说明,这可能会发生,因为你可能创建了git-user作为根用户,然后立即转移到git init,而没有改变用户。

[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server

修复权限

在你确定并修复了潜在的原因(见下文)后,你会想要修复权限:

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。

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

根本原因

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

The repository isn't configured to be a shared repository (see core.sharedRepository in git help config). If the output of: git config core.sharedRepository is not group or true or 1 or some mask, try running: git config core.sharedRepository group and then re-run the recursive chmod and chgrp (see "Repair Permissions" above). The operating system doesn't interpret a setgid bit on directories as "all new files and subdirectories should inherit the group owner". When core.sharedRepository is true or group, Git relies on a feature of GNU operating systems (e.g., every Linux distribution) to ensure that newly created subdirectories are owned by the correct group (the group that all of the repository's users are in). This feature is documented in the GNU coreutils documentation: ... [If] a directory's set-group-ID bit is set, newly created subfiles inherit the same group as the directory, and newly created subdirectories inherit the set-group-ID bit of the parent directory. ... [This mechanism lets] users share files more easily, by lessening the need to use chmod or chown to share new files. However, not all operating systems have this feature (NetBSD is one example). For those operating systems, you should make sure that all of your Git users have the same default group. Alternatively, you can make the repository world-writable by running git config core.sharedRepository world (but be careful—this is less secure). The file system doesn't support the setgid bit (e.g., FAT). ext2, ext3, ext4 all support the setgid bit. As far as I know, the file systems that don't support the setgid bit also don't support the concept of group ownership so all files and directories will be owned by the same group anyway (which group is a mount option). In this case, make sure all Git users are in the group that owns all the files in the file system. Not all of the Git users are in the same group that owns the repository directories. Make sure the group owner on the directories is correct and that all users are in that group.

sudo chmod -R ug+w .;

基本上,.git/objects文件没有写权限。上面的代码行授予目录中所有文件和文件夹的权限。