当我尝试推送到共享git远程时,我收到以下错误:insufficient permission for adding an object to repository database
然后我在这里阅读了一个修复:Fix这适用于下一次推送,因为所有文件都是正确的组,但是下次有人推送更改时,它在对象文件夹中创建了一个具有其默认组的新项目作为小组。我能想到的唯一一件事是更改所有开发人员的默认组,他们检查的项目,但这似乎是一个黑客。有任何想法吗?谢谢。
在确定并修复了根本原因(见下文)后,您将需要修复权限:
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
不是group
或true
或1
或一些面具,尝试运行:
git config core.sharedRepository group
然后重新运行递归的chmod
和chgrp
(参见上面的“修复权限”)。core.sharedRepository
是true
或group
时,Git依赖于GNU操作系统的一个特性(例如,每个Linux发行版)来确保新创建的子目录由正确的组(所有存储库的用户所在的组)拥有。 GNU coreutils documentation中记录了此功能:
... [If]设置目录的set-group-ID位,新创建的子文件继承与目录相同的组,新创建的子目录继承父目录的set-group-ID位。 ... [此机制允许]用户通过减少使用chmod
或chown
共享新文件的需要,更轻松地共享文件。
但是,并非所有操作系统都具有此功能(NetBSD就是一个例子)。对于这些操作系统,您应确保所有Git用户都具有相同的默认组。或者,您可以通过运行git config core.sharedRepository world
使存储库成为可写的(但要小心 - 这不太安全)。Linux,macOS:
cd .git/
sudo chown -R name:group *
其中name
是您的用户名,group
是您的用户名所属的组。
对于我的情况,没有一个建议有效。我在Windows上,这对我有用:
git remote add foo //SERVERNAME/path/to/copied/git
)git push foo master
。它有用吗?大!现在删除not-working repo并将其重命名为之前的任何内容。确保权限和共享属性保持不变。我遇到了同样的问题。在这里阅读我意识到这是消息所指的文件权限。对我来说,修复是:
/etc/I net的.的/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中)
您需要对要推送的目录具有足够的写入权限。
就我而言:Windows 2008服务器
右键单击git repo目录或父目录。
“属性”>“共享”选项卡>“高级共享”>“权限”>确保用户具有适当的访问权限。
您可能意外嵌套了git存储库
您还可能添加了具有相同别名的另一个本地存储库。例如,您现在有2个本地文件夹,称为origin
,因此当您尝试推送时,远程存储库将不接受您的凭据。
重命名本地存储库别名,您可以按照此链接https://stackoverflow.com/a/26651835/2270348
也许你可以留下一个你喜欢的本地存储库作为origin
,其他人将它们重命名为例如origin
到anotherorigin
。请记住,这些只是别名,您需要做的就是记住新的别名及其各自的远程分支。
适合我
sudo chmod -R g+rwX .
拉进Rstudio项目时我得到了这个。我意识到我忘了做:
sudo rstudio
在程序启动时。事实上,因为我有另一个错误,我需要实际做到:
sudo rstudio --no-sandbox
对于Ubuntu(或任何Linux)
从项目根目录,
cd .git/objects
ls -al
sudo chown -R yourname:yourgroup *
您可以通过查看ls -al命令的大部分输出的权限来判断您的姓名和组应该是什么
注意:记住sudo线末尾的星号
sudo chmod -R ug+w .;
基本上,.git/objects
文件没有写入权限。上面的行授予目录中所有文件和文件夹的权限。
使用以下命令,像魔术一样工作
sudo chown -R "${USER:-$(id -un)}" .
完全按照原样输入命令(末尾有额外的空格和一个点)
我只想添加我的解决方案。我在OS X上有一个repo,它在某些目录上拥有root权限,而在其他目录上拥有Home(这是我的用户目录),导致上面列出的相同错误。
谢天谢地,解决方案很简单。从终端:
sudo chown -R Home projectdirectory
调试它的一个好方法是下次它发生时,SSH进入远程仓库,cd进入对象文件夹并执行ls -al
。
如果您看到2-3个文件具有不同的用户:组所有权比这个问题。
过去我发生了一些遗留脚本访问我们的git repo,通常意味着最后一个不同的(unix)用户推送/修改过的文件,而你的用户没有权限覆盖这些文件。您应该创建一个共享git组,所有git用户都在其中,然后递归chgrp
objects
文件夹及其内容,以便它的组所有权是共享的git
组。
您还应该在文件夹上添加一个粘滞位,以便在该文件夹中创建的所有文件始终具有git
组。
chmod g + s目录名
更新:我不知道core.sharedRepository。很高兴知道,虽然它可能就是上述情况。
解决了我...就是这个:
sudo chmod 777 -R .git/objects
如果您在推送更改时使用与计划使用的用户不同的用户运行git init
,则很容易发生这种情况。
如果您盲目地按照[1]上的说明进行操作,那么您可能会以root身份创建git-user,然后立即转到git init而不更改用户。
[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server
添加一些东西之后...提交它们并且完成后推送它!砰!!开始所有问题......正如您应该注意到新项目和现有项目的定义方式存在一些差异。如果其他人试图添加/提交/推送相同的文件或内容(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