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

时间:2011-06-23 00:58:56

标签: git push

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

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

25 个答案:

答案 0 :(得分:772)

修复权限

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

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

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

如果你没有解决根本原因,那么错误将继续存在,你将不得不一遍又一遍地重新运行上述命令。

潜在原因

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

  • 存储库未配置为共享存储库(请参阅core.sharedRepository中的git help config)。如果输出:

    git config core.sharedRepository
    

    不是grouptrue1或某些掩码,请尝试运行:

    git config core.sharedRepository group
    

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

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

    core.sharedRepositorytruegroup时,Git依赖于GNU操作系统的功能(例如,每个Linux发行版),以确保新创建的子目录由正确的组拥有(所有存储库用户所在的组)。 GNU coreutils documentation

    中记录了此功能
      

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

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

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

答案 1 :(得分:379)

对于Ubuntu(或任何Linux)

从项目根目录

cd .git/objects
ls -al
sudo chown -R yourname:yourgroup *

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

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

答案 2 :(得分:40)

sudo chmod -R ug+w .;

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

答案 3 :(得分:27)

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

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

sudo chown -R Home projectdirectory

答案 4 :(得分:26)

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

Play

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

答案 5 :(得分:18)

调试此问题的好方法是下次发生时,SSH进入远程仓库,进入对象文件夹并执行ls -al

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

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

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

  

chmod g + s directory-name

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

答案 6 :(得分:15)

为我解决了...... 就是这样:

sudo chmod 777 -R .git/objects

答案 7 :(得分:9)

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

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

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

答案 8 :(得分: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

要解决此问题,您必须考虑操作系统的权限系统,因为在这种情况下您受其限制。 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

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

Level       u   g   o
Permission rwx r-x ---
Binary     111 101 000
Octal       7   5   0

解决问题

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

$ ls -la | awk '{print $3}' | sort -u 
<your user_name>
<his user_name>

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

$ chmod -R 774 .

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

$ git config core.sharedRepository group

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

答案 9 :(得分:4)

Linux,macOS:

cd .git/
sudo chown -R name:group *

其中name是您的用户名,group是您的用户名所属的群组。

答案 10 :(得分:3)

对于我的案例,没有一项建议有效。我在Windows上,这对我有用:

  • 将远程仓库复制到另一个文件夹
  • 分享文件夹并提供适当的权限。
  • 确保您可以从本地计算机访问该文件夹。
  • 将此仓库添加为本地仓库中的另一个远程仓库。 (git remote add foo //SERVERNAME/path/to/copied/git
  • 推送到foo。 git push foo master。它有用吗?大!现在删除not-working repo并将其重命名为之前的任何内容。确保权限和共享属性保持不变。

答案 11 :(得分:3)

最完善的解决方案是:

从项目目录:

sudo chmod 777 -R .git/objects

答案 12 :(得分:2)

我遇到了同样的问题。在这里阅读我意识到这是消息所指的文件权限。对我而言,解决方法是:

/etc/inetd.d/git-gpv

它以用户' nobody '启动git-daemon,因此缺少写入权限。

# Who   When    What
# GPV   20Nov13 Created this by hand while reading: http://linuxclues.blogspot.co.uk/2013/06>/git-daemon-ssh-create-repository-debian.html
# GPV   20Nov13 Changed owner (to user_git) otherise nobody lack permission to update the repository
#git stream tcp nowait nobody  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo
git stream tcp nowait user_git  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo

(我怀疑其他人调用他们的inetd conf文件git-gpv。通常它会直接在/etc/inetd.conf中)

答案 13 :(得分:2)

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

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

答案 14 :(得分:1)

您可能不小心嵌套git存储库

答案 15 :(得分:1)

您需要对要推送的目录具有足够的写入权限。

就我而言: Windows 2008服务器

右键单击git repo目录或父目录。

属性&gt;分享标签&gt;高级分享&gt;权限&gt;确保用户具有适当的访问权限。

答案 16 :(得分:1)

也有可能您添加了另一个具有相同别名的本地存储库。例如,您现在有2个本地文件夹,称为 origin ,因此当您尝试推送时,远程存储库将不接受您的凭据。

重命名本地存储库别名,您可以点击此链接https://stackoverflow.com/a/26651835/2270348

也许您可以保留自己喜欢的1个本地存储库为origin,而其他存储库则将它们从origin重命名为anotherorigin。请记住,这些只是别名,您所要做的就是记住新的别名及其各自的远程分支。

答案 17 :(得分:0)

为我工作

sudo chmod -R g+rwX .

答案 18 :(得分:0)

进入Rstudio项目时,我得到了这个。我意识到自己忘了做:

sudo rstudio

在程序启动时。实际上,由于我还有另一个错误,我需要实际执行以下操作:

sudo rstudio --no-sandbox

答案 19 :(得分:0)

使用sudo提交-m

  • git add -A
  • sudo git commit -m“将sudo用于提交-m”
  • git push origin branch_name

答案 20 :(得分:0)

我在Samba共享上的远程存储库中遇到此问题;我从此遥控器成功拉出,但是推到它时失败。

错误原因是我的~/.smbcredentials文件中的凭据不正确。

答案 21 :(得分:0)

长时间使用git没问题之后,今天我遇到了这个问题。经过一番思考,我意识到我今天早些时候将umask022更改为其他内容。

其他人的所有答案都是有帮助的,即对有问题的目录执行chmod。但是根本原因是我的新umask,每次在.git/object/下创建新目录时,总会带来新问题。因此,对我来说,长期的解决方案是将umask改回022

答案 22 :(得分:0)

我将加上两美分,以发现目录中具有特定所有权的文件

此问题是由以root用户身份运行某些git命令引起的。 收到的消息是:

$ git commit -a -m "fix xxx"
error: insufficient permission for adding an object to repository database .git/objects
error: setup.sh: failed to insert into database

我首先看了git config -l,然后解决了:

find .git/ -exec stat --format="%G %n" {} + |grep root

chown -R $(id -un):$(id -gn) .git/objects/

git commit -a -m "fixed git objects ownership"

答案 23 :(得分:0)

我在使用 Vagrant 运行远程开发开发机器时遇到此错误。上述解决方案均无效,因为所有文件都具有正确的权限。

我通过将 config.vm.box = "hasicorp/bionic64" 更改为 config.vm.box = "bento/ubuntu-20.10" 来修复它。

答案 24 :(得分:0)

就我而言,解决方案只是再次git commit

问题自动消失。

发生了什么?我使用 ^C (Control-C) 来解决写错误提交消息的问题。 (我从错误的剪贴板粘贴了错误的消息。)所以我假设该进程在后台暂时冻结,暂时锁定了数据库。