当我尝试推送到共享的git远程时,出现以下错误:
insufficient permission for adding an object to repository database
然后,我在此处了解到一个修复程序:修复 此操作适用于下一次推送,因为所有文件都属于正确的组,但是下次有人推送更改时,它将在具有默认组的对象文件夹中创建一个新项目作为组。我唯一能想到的就是更改开发人员签入的所有项目的默认组,但这似乎很容易。有任何想法吗?谢谢。
当我尝试推送到共享的git远程时,出现以下错误:
insufficient permission for adding an object to repository database
然后,我在此处了解到一个修复程序:修复 此操作适用于下一次推送,因为所有文件都属于正确的组,但是下次有人推送更改时,它将在具有默认组的对象文件夹中创建一个新项目作为组。我唯一能想到的就是更改开发人员签入的所有项目的默认组,但这似乎很容易。有任何想法吗?谢谢。
Answers:
在确定并解决了根本原因之后(请参见下文),您将需要修复权限:
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
(请参阅上面的“修复权限”)。
操作系统不会将目录上的setgid位解释为“所有新文件和子目录都应继承组所有者”。
当core.sharedRepository
为is true
或时group
,Git依赖于GNU操作系统的功能(例如,每个Linux发行版)来确保新创建的子目录归正确的组(所有存储库用户所在的组)所有。该功能记录在GNU coreutils文档中:
... [如果设置了目录的set-group-ID位,则新创建的子文件将继承与该目录相同的组,而新创建的子目录将继承父目录的set-group-ID位。... [此机制使]用户可以减少使用
chmod
或chown
共享新文件的需求,从而更轻松地共享文件。
但是,并非所有操作系统都具有此功能(NetBSD是一个示例)。对于那些操作系统,您应确保所有Git用户都具有相同的默认组。另外,您可以通过运行来使存储库在世界范围内可写git config core.sharedRepository world
(但请注意,这不太安全)。
false
或相同umask
),您将一无所获。请参阅git help config
以获取更多详细信息。
git push
使用root帐户发行的。根据此答案,我发现某些git存储库文件的所有者是root(-r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424
)。
X
是大写字母,而不是小写字母x
。大写字母X
表示“ S_IXGRP
如果文件是目录(或S_IX*
设置了其他位),则设置”,因此它不会使所有文件都可执行。这可能是不必要的,但如果在过去的某个时间core.sharedRepository
设置,则可能没有必要0600
。
对于Ubuntu(或任何Linux)
从项目根目录开始,
cd .git/objects
ls -al
sudo chown -R yourname:yourgroup *
您可以通过查看ls -al命令的大多数输出的权限来确定您的名字和您的组应该是什么
注意:记住sudo行末的星星
Sorry, user myuser is not allowed to execute '/bin/chown
*
使所有的差异。谢谢。
ls .git
使用以下命令,就像魔术一样工作
sudo chown -R "${USER:-$(id -un)}" .
完全按原样键入命令(末尾有多余空格和一个点)
sudo chmod -R ug+w .;
基本上,.git/objects
文件没有写权限。上一行授予目录中所有文件和文件夹的权限。
我只是想添加我的解决方案。我在OS X上有一个存储库,该存储库在某些目录中具有root所有权,而在其他目录中具有Home(这是我的用户目录)的所有权,这导致了上面列出的相同错误。
谢天谢地,解决方案很简单。从终端:
sudo chown -R Home projectdirectory
调试此错误的一种好方法是在下次发生此情况时,将SSH SSH到远程仓库中,将cd放入objects文件夹中,然后执行ls -al
。
如果您看到2-3个具有不同user:group所有权的文件,那就是问题所在。
过去,我曾经遇到过一些遗留脚本访问git repo的情况,这通常意味着最后一个不同的(unix)用户推送/修改的文件,而您的用户无权覆盖这些文件。您应该创建一个共享的git组,所有启用了git的用户都位于该组中,然后递归chgrp
该objects
文件夹及其内容,以便该组的所有权成为共享git
组。
您还应该在文件夹上添加一个粘性位,以便在该文件夹中创建的所有文件始终具有的组git
。
chmod g + s目录名
更新:我不了解core.sharedRepository。很高兴知道,尽管它可能只是完成上述操作。
为我解决了...只是这样:
sudo chmod 777 -R .git/objects
Chmod 777
不建议使用,因为它会将您的所有文件暴露给世界其他地方,从而使您的计算机容易受到攻击
chmod 777
,那么100中有99次您不理解该问题,并且可能引起的问题超出了您的解决能力。如上面公认的答案所示,这个问题没有什么不同。
如果您跑了,这很容易发生 git init
与计划在推送更改时使用的用户不同,。
如果您盲目地按照[1]上的说明进行操作,则可能是因为您可能以root用户身份创建了git-user,然后立即继续使用git init而不在其间更改用户。
[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server
Linux,macOS:
cd .git/
sudo chown -R name:group *
name
您的用户名在哪里,是您的用户group
名所属的组。
添加一些东西后...提交它们,并完成所有推送!砰!!开始所有问题...您应该注意到,定义新项目和现有项目的方式有所不同。如果其他人尝试添加/提交/推送相同的文件或内容(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
username:groupname
,但是当我尝试时chmod -R 774 .
,我可以git add --all
成功运行。
就我而言,这些建议都没有奏效。我在Windows上,这对我有用:
git remote add foo //SERVERNAME/path/to/copied/git
)git push foo master
。奏效了吗?大!现在删除无法正常工作的存储库,并将其重命名为以前的版本。确保权限和共享属性保持不变。我遇到了同样的问题。在这里阅读时,我意识到这是消息所指的文件权限。对我来说,解决方法是:
/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中)
也有可能您添加了另一个具有相同别名的本地存储库。例如,您现在有2个本地文件夹,称为origin
因此当您尝试推送时,远程存储库将不接受您的凭据。
重命名本地存储库别名,您可以点击以下链接https://stackoverflow.com/a/26651835/2270348
也许您可以保留自己喜欢的1个本地存储库,origin
而其他的则将其重命名为例如从origin
到anotherorigin
。请记住,这些只是别名,您所要做的就是记住新的别名及其各自的远程分支。
git add
并git commit
以root用户身份-ing 后收到此错误。我用git reset
和这个问题的答案修复了.git
目录权限。