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

ska*_*kaz 567 git push

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

然后我在这里阅读了一个修复程序:修复 这适用于下一次推送,因为所有文件都是正确的组,但是下次有人推送更改时,它在对象文件夹中创建了一个具有其默认组的新项目作为小组.我能想到的唯一一件事是更改所有开发人员的默认组,他们检查的项目,但这似乎是一个黑客.有任何想法吗?谢谢.

Ric*_*sen 823

修复权限

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

cd /path/to/repo.git
sudo chgrp -R groupname .
sudo chmod -R g+rwX .
find . -type d -exec chmod g+s '{}' +
Run Code Online (Sandbox Code Playgroud)

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

如果你没有解决根本原因,错误将继续回来,你将不得不一遍又一遍地重新运行上述命令.

根本原因

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

  • 存储库未配置为共享存储库(见core.sharedRepositorygit help config).如果输出:

    git config core.sharedRepository
    
    Run Code Online (Sandbox Code Playgroud)

    是不是grouptrue1或某些面具,尝试运行:

    git config core.sharedRepository group
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    如果core.sharedRepositorytruegroup,Git的依赖于GNU操作系统的特征(例如,每一个Linux发行),以确保新创建的子目录被正确的组(该组所有存储库的用户都在)所拥有.GNU coreutils文档中记录了此功能:

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

    但是,并非所有操作系统都具有此功能(NetBSD就是一个例子).对于这些操作系统,您应确保所有Git用户都具有相同的默认组.或者,您可以通过运行使存储库成为可写的git config core.sharedRepository world(但要小心 - 这不太安全).

  • 文件系统不支持setgid位(例如,FAT).ext2,ext3,ext4都支持setgid位.据我所知,不支持setgid位的文件系统也不支持组所有权的概念,因此所有文件和目录都将由同一组拥有(哪个组是挂载选项).在这种情况下,请确保所有Git用户都在拥有文件系统中所有文件的组中.
  • 并非所有Git用户都在拥有存储库目录的同一组中.确保目录上的组所有者正确并且所有用户都在该组中.

  • 我必须在我的工作目录中使用**root**帐户发出`git push`.根据这个答案,我发现一些git存储库文件的所有者是**root**(`-r - r - r--.1 root root 6380 5月25 12:39 9b44bd22f81b8a8d0a244fd16f7787a1b1d424`). (9认同)
  • @GiH:如果没有设置,你将得不到任何东西(与`false`或`umask`相同).有关详细信息,请参阅`git help config`. (6认同)
  • @MattBrowne:注意它是大写的`X`,而不是小写的`x`.大写"X"表示"如果文件是目录(或者如果设置了任何其他"S_IX*"位)则设置`S_IXGRP`",因此它不会使所有文件都可执行.它可能是不必要的,但如果`core.sharedRepository`在过去的某个时刻被设置为'0600`则可能没有. (3认同)
  • @francoisromain:该行在所有目录上设置了 setgid 位。见 https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html (2认同)

Ter*_*ryS 411

对于Ubuntu(或任何Linux)

从项目根目录,

cd .git/objects
ls -al
sudo chown -R yourname:yourgroup *
Run Code Online (Sandbox Code Playgroud)

您可以通过查看ls -al命令的大部分输出的权限来判断您的姓名和组应该是什么

注意:记住sudo线末尾的星号

  • 工作得很好!是的,由于某种原因,某些文件夹被分配了不同的名称和组(根). (7认同)
  • 我的问题是我曾经做过一次"git pull"作为root,我认为搞砸了权限......你可以通过做一个`ls .git来检查 (5认同)
  • 我得到:'抱歉,不允许用户myuser执行'/ bin/chown` (2认同)
  • 关于如何找到你的名字的很好的补充:yourgroup,@zois - 谢谢:赞赏 (2认同)

Raj*_*ari 47

sudo chmod -R ug+w .;

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

  • 这对我有用。可悲的是,被接受的答案没有。感谢Rajendra! (2认同)

Cod*_*orm 46

使用以下命令,像魔术一样工作

sudo chown -R "${USER:-$(id -un)}" .
Run Code Online (Sandbox Code Playgroud)

完全按照原样输入命令(末尾有额外的空格和一个点)

  • 这个答案应该指定执行命令的目录。存储库的根目录或 .git 文件夹。 (4认同)
  • 奇迹般有效! (3认同)

Bra*_*don 27

我只想添加我的解决方案.我在OS X上有一个repo,它在某些目录上拥有root权限,而在其他目录上拥有Home(这是我的用户目录),这导致了上面列出的相同错误.

谢天谢地,解决方案很简单.从终端:

sudo chown -R Home projectdirectory
Run Code Online (Sandbox Code Playgroud)


Mau*_*ord 18

调试它的一个好方法是下次它发生时,SSH进入远程仓库,cd进入对象文件夹并执行ls -al.

如果您看到2-3个文件具有不同的用户:组所有权比这个问题.

过去我发生了一些遗留脚本访问我们的git repo,通常意味着最后一个不同的(unix)用户推送/修改过的文件,而你的用户没有权限覆盖这些文件.您应该创建一个共享的git组,所有git用户都在其中,然后递归chgrpobjects文件夹及其内容,以便它的组所有权是共享git组.

您还应该在文件夹上添加一个粘滞位,以便在该文件夹中创建的所有文件始终具有该组git.

chmod g + s目录名

更新:我不知道core.sharedRepository.很高兴知道,虽然它可能就是上述情况.


Jac*_*bec 16

最简单的解决方法是:

从项目目录:

sudo chmod 777 -R .git/objects
Run Code Online (Sandbox Code Playgroud)

  • 这是一个快速的解决方案,就像移开门是让您无法进入家中的快速解决方案一样。它有效,但它不是你应该去想的地方 (4认同)

小智 14

解决了我...就是这个:

sudo chmod 777 -R .git/objects
Run Code Online (Sandbox Code Playgroud)

  • 如果您的建议是"chmod 777",那么99次中有100次你不理解这个问题而且你可能会遇到比你帮助解决的问题更多的问题.正如上面接受的答案所示,这个问题没有什么不同. (23认同)
  • 建议不要使用`Chmod 777`,因为它会将您的所有文件暴露给世界其他地方,从而使您的计算机容易受到攻击 (21认同)
  • 因为即使页面上有可接受的答案,这个不可接受的答案仍然存在. (2认同)
  • 不推荐777权限。 (2认同)

小智 9

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

如果您盲目地按照[1]上的说明进行操作,那么您可能会以root身份创建git-user,然后立即转到git init而不更改用户.

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


Vai*_*ain 9

您需要将此命令复制并粘贴到您的终端上:-

sudo chmod 777 -R .git/objects


Afs*_*ani 6

Linux,macOS:

cd .git/
sudo chown -R name:group *
Run Code Online (Sandbox Code Playgroud)

name您的用户名在哪里,是您的用户group名所属的组。


小智 5

添加一些东西之后...提交它们并且完成后推送它!砰!!开始所有问题......正如您应该注意到新项目和现有项目的定义方式存在一些差异.如果其他人试图添加/提交/推送相同的文件或内容(git将两者保持为相同的对象),我们将面临以下错误:

$ git push
Counting objects: 31, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (21/21), 2.07 KiB | 0 bytes/s, done.
Total 21 (delta 12), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects  remote: fatal: failed to write object
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您必须考虑操作系统的权限系统,因为在这种情况下您受到限制.Tu更好地理解问题,继续检查你的git对象的文件夹(.git/objects).你可能会看到类似的东西:

<your user_name>@<the machine name> objects]$ ls -la
total 200
drwxr-xr-x 25 <your user_name> <group_name> 2048 Feb 10 09:28 .
drwxr-xr-x  3 <his user_name> <group_name> 1024 Feb  3 15:06 ..
drwxr-xr-x  2 <his user_name> <group_name> 1024 Jan 31 13:39 02
drwxr-xr-x  2 <his user_name> <group_name> 1024 Feb  3 13:24 08
Run Code Online (Sandbox Code Playgroud)

*请注意,这些文件的权限仅授予您的用户,没有人永远不会更改它...*

Level       u   g   o
Permission rwx r-x ---
Binary     111 101 000
Octal       7   5   0
Run Code Online (Sandbox Code Playgroud)

解决问题

如果您拥有超级用户权限,则可以使用第二步自行更改所有权限,在任何其他情况下,您需要向所有用户询问使用其用户创建的对象,使用以下命令知道他们是谁:

$ ls -la | awk '{print $3}' | sort -u 
<your user_name>
<his user_name>
Run Code Online (Sandbox Code Playgroud)

现在,您和所有文件的所有者用户必须更改这些文件权限,执行以下操作:

$ chmod -R 774 .
Run Code Online (Sandbox Code Playgroud)

之后,您将需要添加一个新属性,该属性相当于--shared =为新存储库完成的组,根据文档,这使存储库组可写,执行它:

$ git config core.sharedRepository group
Run Code Online (Sandbox Code Playgroud)

https://coderwall.com/p/8b3ksg


小智 5

只需将其复制并粘贴到您自己的终端中即可。

sudo chown -R "${USER:-$(id -un)}" .
Run Code Online (Sandbox Code Playgroud)