Git推送错误:没有足够的权限将对象添加到存储库数据库
当我尝试推送到共享的git远程时,出现以下错误: insufficient permission for adding an object to repository database
然后我在这里读到一个修正: 修复这个工作是为了下一个推动,因为所有的文件都是正确的组,但是下一次有人推动了一个改变,它在对象文件夹中创build了一个新的项目,作为小组。 我能想到的唯一的事情就是改变所有开发人员的默认组,以便他们检查的项目,但这似乎是一个黑客。 有任何想法吗? 谢谢。
修复权限
在确定并修复了潜在的原因后(见下文),您将需要修复权限:
cd /path/to/repo.git chgrp -R groupname . chmod -R g+rwX . find . -type d -exec chmod g+s '{}' +
如果你没有解决这个问题的根本原因,这个错误将会持续下去,你将不得不一直重复运行上面的命令。
潜在原因
错误可能是由下列之一引起的:
-
存储库没有configuration为共享存储库(请参阅
git help config
core.sharedRepository
)。 如果输出:git config core.sharedRepository
是不是
group
或true
或1
或一些面具,尝试运行:git config core.sharedRepository group
然后重新运行recursion
chmod
和chgrp
(请参阅上面的“修复权限”)。 -
操作系统不会将目录上的setgid位解释为“所有新文件和子目录应inheritance组所有者”。
当
core.sharedRepository
为true
或group
,Git依赖GNU操作系统的特性(例如,每个Linux发行版)来确保新创build的子目录由正确的组(所有存储库用户所在的组)拥有。 这个特性在GNU coreutils文档中有logging :…如果设置了目录的set-group-ID位,新创build的子文件inheritance与目录相同的组,并且新创build的子目录inheritance父目录的set-group-ID位。 … [这种机制可以让用户]更轻松地共享文件,减less使用
chmod
或chown
来共享新文件的需要。但是,并不是所有的操作系统都有这个function(NetBSD就是一个例子)。 对于这些操作系统,您应该确保所有的Git用户拥有相同的默认组。 或者,您可以通过运行
git config core.sharedRepository world
来使存储库世界可写(但要小心 – 这是不太安全的)。 - 文件系统不支持setgid位(例如,FAT)。 ext2,ext3,ext4都支持setgid位。 据我所知,不支持setgid位的文件系统也不支持组所有权的概念,因此无论如何所有的文件和目录都归属于同一个组(这个组是挂载选项)。 在这种情况下,确保所有的Git用户都在拥有文件系统中所有文件的组中。
- 并不是所有的Git用户都在同一个拥有版本库目录的组中。 确保目录上的组所有者是正确的,并且所有用户都在该组中。
对于Ubuntu(或任何Linux)
从项目根,
cd .git/objects ls -al sudo chown -R yourname:yourgroup *
您可以通过查看ls -al命令的大部分输出的权限来确定您的名称和组应该是什么
注意:请记住sudo行尾的星号
sudo chmod -R ug+w .;
基本上, .git/objects
文件没有写入权限。 上面的行授予目录中所有文件和文件夹的权限。
我只是想添加我的解决scheme。 我有一个在一些目录和家庭(这是我的用户目录)的所有权在根源上的OS X的回购上其他人导致上面列出相同的错误。
谢天谢地,解决scheme很简单。 从docker:
sudo chown -R Home projectdirectory
debugging的好方法是下次发生这种情况,SSH进入远程仓库,cd进入objects文件夹并执行ls -al
。
如果你看到2-3个文件与不同的用户:组所有权比这是问题。
过去发生在我身上的一些遗留脚本访问我们的git仓库,通常意味着一个不同的(unix)用户最后推送/修改了文件,而您的用户没有权限覆盖这些文件。 你应该创build一个共享的git组,让所有启用git的用户都可以使用,然后recursion地chgrp
这个objects
文件夹和它的内容,这样它的组拥有权就是共享的git
组。
您还应该在该文件夹上添加一个粘性位,以便在该文件夹中创build的所有文件将始终具有一组git
。
chmod g + s目录名称
更新:我不知道关于core.sharedRepository。 很高兴知道,虽然它可能只是做到了上述。
为我解决…只是这个:
sudo chmod 777 -R .git/objects
如果您运行git init
使用与您计划在推送更改时使用的其他用户不同的用户,则很容易发生这种情况。
如果你盲目地按照[1]上的指示,这可能会发生,因为你可能创build了git-user作为root,然后立即移动到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
为了解决这个问题,在这种情况下,你必须考虑到操作系统的权限系统,因为你受到限制。 涂更好地理解问题,继续检查你的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 ugo Permission rwx rx --- Binary 111 101 000 Octal 7 5 0
解决问题
如果您拥有超级用户权限,则可以使用第二步自行更改所有权限,而在其他情况下,则需要向所有用户请求使用其用户创build的对象,并使用以下命令来了解他们是谁:
$ ls -la | awk '{print $3}' | sort -u <your user_name> <his user_name>
现在你和所有文件的所有者用户将不得不改变这些文件的权限,这样做:
$ chmod -R 774 .
之后,您需要添加一个新的属性,该属性相当于为新存储库完成的–shared = group,根据文档,这使存储库组可写,执行:
$ git config core.sharedRepository group
对于我的情况,没有任何build议的工作。 我在Windows上,这对我工作:
- 将远程回购复制到另一个文件夹中
- 共享文件夹并给予适当的权限。
- 确保您可以从本地机器访问该文件夹。
- 添加这个回购作为另一个远程回购在您当地的回购。 (
git remote add foo //SERVERNAME/path/to/copied/git
) - 推到foo。
git push foo master
。 有用吗? 大! 现在删除不工作的回购,并将其重命名为以前的任何东西。 确保权限和共享属性保持不变。
我遇到了同样的问题。 在这里阅读,我意识到这是消息所指的文件权限。 对我来说,修正是在:
/etc/inetd.d/git-gpv
它以“ nobody ”用户身份启动git-daemon,因此缺less写入权限。
# 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中)
Linux,macOS:
cd .git/ sudo chown -R name:group *
其中name
是您的用户名, group
是您的用户名所属的组。
您需要对要推送的目录具有足够的写入权限。
在我的情况下: Windows 2008服务器
右键单击git repo目录或父目录。
“属性”>“共享”选项卡>“高级共享”>“权限”>确保用户具有适当的访问权限。
尝试推送IDE时出现此错误(在本例中为PHPStorm)。 当我试图推动使用terminal(OSX)它确实工作! 所以,这显然是一个权限问题。 虽然我找不到如何永久解决它,使用
$ sudo git push origin master
会做的伎俩
你可能会意外地嵌套git仓库 ! 这是这个错误的最常见的来源。