Git推送错误:权限不足,无法将对象添加到存储库数据库

Git推送错误:权限不足,无法将对象添加到存储库数据库,git,push,Git,Push,当我尝试推送到共享git remote时,出现以下错误: 将对象添加到存储库数据库的权限不足 然后我在这里读到了一个修复方法:这对下一次推送有效,因为所有文件都属于正确的组,但下一次有人推送更改时,它在对象文件夹中创建了一个新项目,该项目的默认组为组。我能想到的唯一一件事就是为他们签入的项目更改所有开发人员的默认组,但这看起来像是一个黑客行为。有什么想法吗?谢谢。修复权限 确定并修复根本原因(请参见下文)后,您将需要修复权限: cd /path/to/repo.git sudo chgrp -R

当我尝试推送到共享git remote时,出现以下错误:
将对象添加到存储库数据库的权限不足

然后我在这里读到了一个修复方法:这对下一次推送有效,因为所有文件都属于正确的组,但下一次有人推送更改时,它在对象文件夹中创建了一个新项目,该项目的默认组为组。我能想到的唯一一件事就是为他们签入的项目更改所有开发人员的默认组,但这看起来像是一个黑客行为。有什么想法吗?谢谢。

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

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-ra+rwX。

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

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

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

    git config core.sharedRepository
    
    不是
    group
    true
    1
    或某个掩码,请尝试运行:

    git config core.sharedRepository group
    
    然后重新运行递归的
    chmod
    chgrp
    (请参阅上面的“修复权限”)

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

    core.sharedepository
    true
    group
    时,Git依赖GNU操作系统的一项功能(例如,每个Linux发行版),以确保新创建的子目录归正确的组(存储库的所有用户所在的组)所有。此功能记录在:

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

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

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

    • 一个很好的调试方法是在下次发生这种情况时,将SSH放入远程repo,将cd放入objects文件夹并执行
      ls-al

      如果您看到2-3个具有不同用户:组所有权的文件,那么这就是问题所在

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

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

      chmod g+s目录名

      更新:我不知道core.sharedepository。很高兴知道这一点,尽管它可能只是做了上述工作。

      对于Ubuntu(或任何Linux)

      从项目根目录

      cd .git/objects
      ls -al
      sudo chown -R yourname:yourgroup *
      
      您可以通过以下方式告知您的姓名和您的团队:

      # for yourname
      whoami
      # for yourgroup
      id -g -n <yourname>
      
      #你的名字
      哇
      #为您的团队
      id-g-n
      

      注意:还记得sudo行末尾的星号吗?我只是想添加我的解决方案。我在OSX上有一个repo,它在一些目录上拥有root的所有权,在其他目录上拥有Home(这是我的用户目录),这导致了上面列出的相同错误

      谢天谢地,解决办法很简单。从终端:

      sudo chown -R Home projectdirectory
      

      我碰到了同样的问题。读到这里,我意识到这条消息所指的是文件权限。对我来说,解决办法是:

      /etc/inetd.d/git-gpv

      它正在以用户“nobody”的身份启动git守护进程,因此缺少写入权限

      # 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中)

      添加一些内容后。。。提交它们,并在完成后推它!猛敲开始所有问题。。。正如您应该注意到的,在定义新项目和现有项目的方式上存在一些差异。如果其他人试图添加/提交/推送相同的文件或内容(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
      
      要解决这个问题,您必须记住操作系统的权限系统,因为在这种情况下,您受到它的限制。为了更好地理解这个问题,请继续检查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 .
      
      $ git config core.sharedRepository group
      
      sudo chmod 777 -R .git/objects
      
      cd .git/
      sudo chown -R name:group *
      
      sudo chown -R "${USER:-$(id -un)}" .
      
      sudo chmod -R g+rwX .
      
      sudo rstudio
      
      sudo rstudio --no-sandbox
      
      sudo chmod 777 -R .git/objects
      
      $ 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
      
      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"