【问题标题】:Error pushing to GitHub - insufficient permission for adding an object to repository database推送到 GitHub 时出错 - 将对象添加到存储库数据库的权限不足
【发布时间】:2010-12-27 11:21:20
【问题描述】:

我在尝试向我的 GitHub 存储库执行“git push”时收到一个不寻常的错误:

计数对象:8,完成。 使用 2 个线程的 Delta 压缩。 压缩对象:100% (4/4),完成。 写入对象:100% (5/5),1.37 KiB,完成。 总计 5(增量 2),重复使用 0(增量 0) 错误:将对象添加到存储库数据库的权限不足 ./objects 致命:无法写入对象 错误:解包对象退出,错误代码为 128 error: unpack failed: unpack-objects 异常退出 到 git@github.com:bixo/bixo.git ! [远程拒绝] master -> master (n/a (unpacker error)) 错误:未能将一些参考推送到 'git@github.com:bixo/bixo.git'
  • 从 GitHub 进行干净克隆后,我可以编辑/添加/提交/推送修改后的文件。
  • 如果我再次重复此操作,则会出现上述错误。
  • 我可以很好地推送到其他 GitHub 存储库。
  • 我已经检查了我这边的文件/目录权限,它们似乎没问题。
  • 我在 Mac OS X 10.5.8 上运行 git 1.6.2.3

上面的存储库是我之前的 Stack Overflow 问题 (SO 1904860) 的乐趣来源,所以 GitHub 存储库可能已损坏。我通过搜索发现的唯一类似问题是 github 上报告的 unpack failed 问题。以前有没有其他人遇到过这个问题,尤其是当使用 GitHub 时?

【问题讨论】:

  • 对出现此错误的人的另一个提示:我收到此错误是因为我使用了错误的用户推送。我的服务器有用户foogit;两者都可以读取/opt/git/<repo>,但只有git 可以写入它。如果.git/config 中没有给出git,则默认为当前用户,我忘记了。下面的详细答案都不是必需的。

标签: git github


【解决方案1】:
 user@M063:/var/www/html/app/.git/objects$ sudo chmod 777 -R .git/objects
 user@M063:/var/www/html/app/.git/objects$ sudo chown -R user:user .git/objects/

【讨论】:

    【解决方案2】:

    chmod 应该是 chown,所以正确的行是:

    sudo chown -R gituser:gituser objects
    

    【讨论】:

      【解决方案3】:

      当我尝试git pull 时,这发生在我身上。一些分析表明,有人过去曾使用 root 提交,从而在 .git/objects 中创建了一些具有 root 所有权的对象。

      所以我跑了

      cd <repo>
      la .git/objects/
      

      这表明 root 对某些对象(目录)的所有权如下:

      user@host:/repo> la .git/objects/
      total 540
      drwxr-xr-x 135 user user 4096 Jun 16 16:29 .
      drwxr-xr-x   8 user user 4096 Jun 16 16:33 ..
      drwxr-xr-x   2 user user 4096 Mar  1 17:28 01
      drwxr-xr-x   2 user user 4096 Mar  1 17:28 02
      drwxr-xr-x   2 user user 4096 Jun 16 16:27 03
      drwxr-xr-x   2 user user 4096 Mar  3 13:22 04
      drwxr-xr-x   2 root root 4096 Jun 16 16:29 05
      drwxr-xr-x   2 user user 4096 Jun 16 16:28 07
      drwxr-xr-x   2 root root 4096 Jun 16 16:29 08
      

      然后我跑了

      sudo chown -R user:user .git/objects/
      

      它成功了!

      当然,我将 user 替换为我的真实用户。

      【讨论】:

        【解决方案4】:

        当您在 github 之外看到此错误时,这里有一个补救措施。

        从: http://mapopa.blogspot.com/2009/10/git-insufficient-permission-for-adding.html

        ssh me@myserver
        cd repository/.git
        
        sudo chmod -R g+ws *
        sudo chgrp -R mygroup *
        
        git config core.sharedRepository true
        

        此后,git 守护进程在写入 .git/objects 时应使用组文件权限。

        【讨论】:

        • +1 它对我们有用。 sudo chmod -R g+ws * 中的“s”是什么意思?
        • 这将允许其他用户创建的任何新文件保持根目录的组权限。否则,您将在推送到存储库时遇到错误。 See setuid and setgid
        • 我在 Debian 6 和 PHPStorm IDE 上使用 Gitorious 时遇到了同样的错误,并显示此消息“错误:将对象添加到存储库数据库 .git/objects 的权限不足”。我在项目父文件夹上使用了这个解决方案,与“+s 技巧”配合得很好。
        • repo-config 已过时。应该是git config core.sharedRepository true
        • 注意:如果您使用通配符“”,隐藏的文件和文件夹(例如.git!)可能不会受到影响!因此,如果上述方法不适合您,请同时运行 ./.git 的命令
        【解决方案5】:

        你试过sudo git push -u origin --all吗?有时这是您唯一需要避免此问题的方法。它要求您输入管理员系统密码 - 您可以登录到您的机器的密码 - 这就是您需要推送的内容 - 或提交,如果是这样的话。

        【讨论】:

          【解决方案6】:
          sudo chmod 777 -R .git/objects
          

          【讨论】:

          • 这对我有用......但是WTF??几个月来我一直在更新仓库,今天下午突然开始了……
          • 对我的修复几乎相同,但涉及更改/更正 .git 目录中某些文件的所有者。我在以“root”身份登录时进行了一些 git 维护,这似乎要么将所有者更改为 root,要么使用 git 所依赖的 root 的所有者创建了一些新文件。我在“apache”所有者下运行了一个自动部署脚本,然后停止工作。
          • chmod 777 从来都不是一个好的解决方案,只是一个不安全的解决方法。试试@Syvex 的答案(使用 setgid)
          【解决方案7】:

          我收到此错误是因为每次用户推送某些内容时,文件的组都会更改为用户。然后,如果其他用户尝试推送到存储库,则会导致权限错误,并且推送被拒绝。因此,需要让您的系统管理员更改存储库的设置,以便任何用户的任何推送都不会更改存储库中的任何文件组。

          为避免此类问题,请确保在初始化 git 存储库时,使用命令“git init --shared=group”。

          【讨论】:

          【解决方案8】:
          sudo su root
          
          chown -R user:group dir
          

          目录是你的 git repo。

          然后做:

          git pull origin master
          

          您会看到其他人提交的更改。

          【讨论】:

            【解决方案9】:

            在我的情况下,我的机器和 git 虚拟服务器之间没有统一的身份验证(例如在域内 + 类似 AD 的服务)。因此 git 用户和组对于虚拟服务器来说是本地的。在我的情况下,我的远程用户(我用来登录远程服务器)只是没有添加到远程 git 组中。

            ssh root@<remote_git_server>
            usermod -G <remote_git_group> <your_remote_user>
            

            然后检查上面帖子中描述的权限......

            【讨论】:

              【解决方案10】:

              你可以用这个

              sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git"
              

              【讨论】:

              • 这是在做什么?你能补充解释吗?
              • 这将获得您的仓库的顶级目录,因此无论您当前在您的仓库中的哪个位置,该命令都将起作用。如果您已经在根目录中,则可以运行 sudo chown -R $USER:$USER .git
              • 将其编辑到您的问题中。否则你的问题就没用了。
              【解决方案11】:

              尝试执行以下操作:

              转到您的服务器

                  cd rep.git
                  chmod -R g+ws *
                  chgrp -R git *
                  git config core.sharedRepository true
              

              然后转到您的工作副本(本地存储库)并通过git repack master重新打包它

              非常适合我。

              【讨论】:

                【解决方案12】:

                检查存储库: $ git远程-v

                origin  ssh://git@example.com:2283/srv/git/repo.git (fetch)
                origin  ssh://git@example.com:2283/srv/git/repo.git (push)
                

                注意这里有一个 'git@' 子字符串,它指示 git 在远程服务器上以用户名 'git' 进行身份验证。如果省略此行,git 将使用不同的用户名进行身份验证,因此会出现此错误。

                【讨论】:

                  【解决方案13】:

                  这个问题通常是由 Git 服务器文件系统上的错误用户和组权限引起的。 git 存储库必须归用户及其组所有。

                  例子:

                  如果你的用户叫“git”,他的组是“gitgroup”,Git repo的位置是:git@mygitserverxyz.com:path/to/repo.git

                  然后做一个:

                  sudo chown -R git:gitgroup path/to/repo.git/

                  这为我修复了 git 权限不足的错误。

                  【讨论】:

                  • chown: 无效用户:`git:git'
                  • @MariusKavansky 尝试 $USER:$USER 而不是 git:git
                  • 在我的情况下这只适用于一段时间。推了几下后我必须重做。
                  • 这是最好的答案,但您应该说您可以将 chown 限制为“.git/objects”,而您称为“git”的用户就是您登录的用户。 git 服务器是否知道用户这一事实并不重要。
                  【解决方案14】:

                  在你添加一些东西之后......提交它们并在完成推送之后!砰!!开始所有问题...您应该注意到,新项目和现有项目的定义方式存在一些差异。如果其他人尝试添加/提交/推送相同的文件或内容(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 .
                  

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

                  $ git config core.sharedRepository group
                  

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

                  【讨论】:

                    【解决方案15】:

                    我想当上面描述的 git 问题发生时,很多像我这样的人最终会出现在这样的论坛中。但是,可能导致问题的原因太多了,我只想分享一下我已经从上面学到的导致我遇到麻烦的原因。

                    我在 Sitecom 的 Linux NAS 上拥有我的存储库(请不要从 Sitecom 购买 NAS)。我在这里有一个 repo,它在许多计算机上被克隆,但我突然被拒绝推送。最近我安装了一个插件,以便我的 NAS 可以作为一个 Squeezebox 服务器。

                    此服务器扫描要共享的媒体。我不知道的是,可能由于错误,服务器将用户和组设置更改为挤压:用户它查看的所有文件。这就是所有文件。从而改变了我必须推动的权利。

                    服务器消失了,重新建立了正确的权限设置,一切正常。

                    我用过

                    chmod -R g+ws *
                    chown -R <myuser>:<mygroup> *
                    

                    必须将 myuser 和 mygroup off-course 替换为适合您系统的设置。试试 git:git 或 gituser:gituser 或其他你可能喜欢的东西。,

                    【讨论】:

                      【解决方案16】:

                      以上没有对我有用。几个小时后,我找到了问题的原因: 我使用了类型的 repo url

                      ssh://git@example.com/~git/repo.git
                      

                      不幸的是,我存储了一个名为 example.com 的腻子会话,该会话被配置为以用户 myOtherUser 身份登录。

                      所以,虽然我认为 git 使用用户“git”连接到主机 example.com,但 Git/TortoiseGit 已连接到使用用户 myOtherUser 的 putty 会话 example.com。这会导致完全相同的..insufficient permission.. 错误(因为两个用户都在不同的组中)。

                      解决方案:将 putty 会话 example.com 重命名为 myOtherUse@example.com

                      【讨论】:

                        【解决方案17】:

                        如果您稍后设置权限后仍然收到此错误,您可能需要修改您的创建掩码。我们发现我们的新提交(对象下的文件夹)仍在创建时没有组写入权限,因此只有提交它们的人才能推送到存储库中。

                        我们通过将 SSH 用户的 umask 设置为 002 以及所有用户共享的适当组来解决此问题。

                        例如

                        umask 002
                        

                        中间的0默认允许组写入。

                        【讨论】:

                        • 你确定在 Unix 或 Linux 中有这样的命令吗?因为我很确定 umask 不是特定于位置的。
                        • 是的,很抱歉你是对的 - 我不知道为什么我认为它有一个额外的目录参数。它只适用于用户。我已经更新了评论。
                        【解决方案18】:

                        这行得通:

                        sudo chmod -R gituser.gituser objects
                        

                        【讨论】:

                        • 没有。 chmod 更改文件权限并需要模式作为参数,而不是用户和组。要么是chmod -R ${some_octal_num} bla 要么是chown -R ${some_user}:${some_group} bla
                        【解决方案19】:

                        奇怪的是,我在我拥有的一个 repo 克隆上遇到了这个问题,但在我拥有的另一个上没有。除了重新克隆 repo(一位同事成功解决了这个问题)之外,我还设法对失败开始之前的提交进行了“git reset”。然后我重新提交了更改,之后我就可以成功推送了。因此,尽管所有迹象表明服务器上存在问题,但在这种情况下,这显然表明本地存储库中存在一些奇怪之处。

                        【讨论】:

                          【解决方案20】:

                          由于错误涉及对象文件夹的权限,所以我直接在对象文件夹上做了一个 chown,它对我有用。

                          【讨论】:

                            【解决方案21】:

                            好的 - 原来这是 GitHub 上的权限问题,发生在 emi/bixo 到 bixo/bixo 的分支期间。 Tekkub 修复了这些问题后,它又开始工作了。

                            【讨论】:

                            • 发生了什么,您是如何解决的?我知道那是不久前的事了……有什么想法吗?
                            • 这是 GitHub 方面的一个问题 - 所以我不知道他们究竟做了什么来修复它,只是 GitHub 上的“Tekkub”说“我修复了权限”,然后它就起作用了。
                            • 酷。谢谢(你的)信息。我结束了重新克隆回购。次优,但它有效。干杯!
                            • 我们,呃,我们修复了故障。所以他不会再收到薪水了,所以它会自然而然地解决。
                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-07-08
                            • 1970-01-01
                            • 2012-10-15
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2021-04-23
                            相关资源
                            最近更新 更多