首页 > 解决方案 > git push 错误,无法写入 sha1 文件名 ./objects

问题描述

这是一个问题。

我创建了一个新的存储库

mkdir -p repositories/project.git
cd repositories/project.git
git init --bare --shared=all

存储库位于共享本地文件夹中。UMASK 是 022。

稍后,我团队中的人能够克隆项目并推送一些更改。但是,当他们尝试执行“git push”时,他们很快就会遇到这个问题。

error: unable to write sha1 filename ./objects/3c/c2f933427a4215d3237a0c3b874a4ff16725: Permission denied
To myaccountname@nameofthecomputer:/repositories/project.git
 ! [remote rejected] master -> master (unable to migrate objects to permanent storage)
error: failed to push some refs to 'myaccountname@nameofthecomputer:/repositories/project.git'

问题显然在于 git 创建一些内部文件/对象的方式,因为如果我这样做:

sudo chmod -R 777 project.git

问题暂时消失了。

我究竟做错了什么?

标签: linuxgit

解决方案


git init --shared=all使存储库对所有用户都可,但不是对所有用户都可。使所有用户都可以写入任何目录(不使用粘性位)通常会带来巨大的安全风险,因此 Git 不提供该选项。

如果您希望人们都能够以这种方式写入 Git 存储库,那么将他们全部放在一个组中,例如git. 将主存储库及其所有子目录更改为具有该组,并使每个目录设置为 setgid。这意味着创建的每个目录和文件都将具有 group git。由于使用--shared=all,Git 将使该组的所有文件和目录可写,用户应该能够正常推送到存储库。

请注意,umask这里不相关,因为 Git 会调整权限以遵守您指定的设置。


推荐阅读