Git Push错误:没有足够的权限向存储库数据库添加对象


591

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

然后,我在此处了解到一个修复程序:修复 此操作适用于下一次推送,因为所有文件都属于正确的组,但是下次有人推送更改时,它将在具有默认组的对象文件夹中创建一个新项目作为组。我唯一能想到的就是更改开发人员签入的所有项目的默认组,但这似乎很容易。有任何想法吗?谢谢。


我无意中git addgit commit以root用户身份-ing 后收到此错误。我用git reset和这个问题的答案修复了.git目录权限。
StockB

我怎样才能找出哪些对象时,它将试图创建(当手动调试这样的权限问题)?错误消息过于模糊。
mirabilos

我首先使用sudo复制粘贴另一个.git文件时遇到此错误。因此,文件具有sudo sudo作为名称和组。
文森特

Answers:


863

维修权限

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

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.sharedRepository为is true或时group,Git依赖于GNU操作系统的功能(例如,每个Linux发行版)来确保新创建的子目录归正确的组(所有存储库用户所在的组)所有。该功能记录在GNU coreutils文档中

    ... [如果设置了目录的set-group-ID位,则新创建的子文件将继承与该目录相同的组,而新创建的子目录将继承父目录的set-group-ID位。... [此机制使]用户可以减少使用chmodchown共享新文件的需求,从而更轻松地共享文件。

    但是,并非所有操作系统都具有此功能(NetBSD是一个示例)。对于那些操作系统,您应确保所有Git用户都具有相同的默认组。另外,您可以通过运行来使存储库在世界范围内可写git config core.sharedRepository world(但请注意,这不太安全)。

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

1
@Richard Hansen-我真的不知道强制所有权是什么意思。我正在寻找chmod的人,但对这个词的了解还不足以使这些词有意义:)有任何提示吗?
skaz 2011年

7
@GiH:如果未设置任何内容(与false或相同umask),您将一无所获。请参阅git help config以获取更多详细信息。
理查德·汉森

10
我一定是在工作目录中git push使用root帐户发行的。根据此答案,我发现某些git存储库文件的所有者是root-r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424)。
刘岩刘研

3
@MattBrowne:请注意,它X是大写字母,而不是小写字母x。大写字母X表示“ S_IXGRP如果文件是目录(或S_IX*设置了其他位),则设置”,因此它不会使所有文件都可执行。这可能是不必要的,但如果在过去的某个时间core.sharedRepository设置,则可能没有必要0600
理查德·汉森

2
@francoisromain:该行在所有目录上设置了setgid位。参见gnu.org/software/coreutils/manual/html_node/…–
理查德·汉森

440

对于Ubuntu(或任何Linux)

从项目根目录开始,

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

您可以通过查看ls -al命令的大多数输出​​的权限来确定您的名字和您的组应该是什么

注意:记住sudo行末的星星


7
很棒!是的,由于某些原因,某些文件夹被分配了不同的名称和组(根)。
Peter Arandorenko 2014年

2
我得到:Sorry, user myuser is not allowed to execute '/bin/chown
Francisco Corrales Morales 2014年

*使所有的差异。谢谢。
布拉德利洪水

5
我的问题是我曾经以root用户身份执行过“ git pull”,我认为这搞砸了权限...您可以通过执行ls .git
rogerdpack

感谢您的快速解决方案!
helvete 2015年



27

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

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

sudo chown -R Home projectdirectory

同样的事情发生在我身上。我无法弄清楚某些对象是如何获得根所有权的,但是它们确实是。
vy32 2014年

18

调试此错误的一种好方法是在下次发生此情况时,将SSH SSH到远程仓库中,将cd放入objects文件夹中,然后执行ls -al

如果您看到2-3个具有不同user:group所有权的文件,那就是问题所在。

过去,我曾经遇到过一些遗留脚本访问git repo的情况,这通常意味着最后一个不同的(unix)用户推送/修改的文件,而您的用户无权覆盖这些文件。您应该创建一个共享的git组,所有启用了git的用户都位于该组中,然后递归chgrpobjects文件夹及其内容,以便该组的所有权成为共享git组。

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

chmod g + s目录名

更新:我不了解core.sharedRepository。很高兴知道,尽管它可能只是完成上述操作。


15

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

sudo chmod 777 -R .git/objects

21
Chmod 777不建议使用,因为它会将您的所有文件暴露给世界其他地方,从而使您的计算机容易受到攻击
Elena 2015年

23
如果您的建议是chmod 777,那么100中有99次您不理解该问题,并且可能引起的问题超出了您的解决能力。如上面公认的答案所示,这个问题没有什么不同。
jonatan

你们为什么不提出可接受的答案,却说这是错误的选择?
Giovani

2
因为即使页面上有可接受的答案,但这个不可接受的答案仍然存在。
Teh JoE

sudo chmod -R 777 .git / objects
Nabeel Ahmed '18年



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 = group等效,根据文档,这使存储库组可写,请执行以下操作:

$ git config core.sharedRepository group

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


我的情况都一样username:groupname,但是当我尝试时chmod -R 774 .,我可以git add --all成功运行。
约翰·斯基贝克

3

就我而言,这些建议都没有奏效。我在Windows上,这对我有用:

  • 将远程仓库复制到另一个文件夹
  • 共享文件夹并给予适当的权限。
  • 确保可以从本地计算机访问该文件夹。
  • 将此仓库添加为本地仓库中的另一个远程仓库。(git remote add foo //SERVERNAME/path/to/copied/git
  • 推到foo。git push foo master。奏效了吗?大!现在删除无法正常工作的存储库,并将其重命名为以前的版本。确保权限和共享属性保持不变。

1
就我而言,只需将本地文件夹复制到新文件夹,删除旧文件夹,然后将新文件夹重命名为旧名称,即可解决权限问题。
mgiuffrida

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


1

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

就我而言:Windows 2008服务器

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

属性>共享选项卡>高级共享>权限>确保用户具有适当的访问权限。



1

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

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

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



0

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

sudo rstudio

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

sudo rstudio --no-sandbox

0

使用sudo提交-m

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

0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.