我在一个克隆的仓库上,试图推送到我的远程分支。提交工作正常,但是每当我尝试推送时,都会收到以下信息:
error: unable to write file ./objects/foo/bar: Permission denied
我拥有本地存储库中的所有文件,并且通常推送工作正常,但是一段时间后出现此错误并且我无法推送。
解决该问题的唯一方法是恢复到原始位置的最后一次提交并尝试找到应该引起问题的文件。
然后我打开一个新文件并粘贴旧“损坏”文件中的内容。有时这也无济于事,显然这不是一个可行的解决方法。
答案1
我遇到了这个问题,并找到了这个问题。我读了以下提示:https://www.thegeekstuff.com/2017/05/git-push-error/并总结如何解决了这个问题(对我来说)。
解决方法是配置持有 GIT REPO 的主机,使其包含一个共享组,所有 git 用户都添加到该组中。例如,/etc/group
git:x:4001:user1,user2
接下来,在持有 git repo 的主机上,运行以下命令:
cd /local/git-repos/repo1.git
sudo chgrp -R git objects
sudo chmod -R g+rws objects
对我来说,这解决了问题。参考文章详细介绍了如何将存储库配置为共享存储库,但我还没有这样做。
git config core.sharedRepository group
为什么会发生这种情况?如果你感兴趣的话,请继续阅读。
为什么会发生这种情况
对我来说,这种情况发生在我设置一个私人 git 存储库时,我 (user1) 与一些同事共享该存储库。该存储库位于我的主机 (即 host1) 上,并且 user2@host2 也在使用它。
下面是我用来设置的步骤,并在适当的地方解释了问题发生的位置。
我是 user1@host1,我使用以下命令创建了一个裸 git repo:
mkdir /local/git-repos cd /local/git-repos git init --bare repo1.git
我设置了一个 ~/.ssh/config 文件,以便 git repo 使用的名称是一个合乎逻辑的名称。这样做是为了如果我将我的机器移到另一台机器上,我所要做的就是将我的主机别名更新为新的计算机名称。
文件:
$HOME/.ssh/config
Host mygithost HostName host1
然后我使用克隆仓库
cd $HOME git clone mygithost:/local/git-repos/repo1.git cd repo1 # Add files and use normal git commands git add -u . git commit git push
更新将发送到计算机上的 git repo
设置用户 2,以便他们可以访问同一个 GIT 存储库
- 您需要像为 user1 所做的那样设置 $HOME/.ssh/config 文件。
- 确保用户以自己的身份通过 ssh 进入 host1。
ssh user2@mygithost echo it worked cd $HOME git clone mygithost:/local/git-repos/repo1.git
此时,两个用户(user1 和 user2)都可以访问共享的 GIT 存储库。
如果两个都用户提交后,git REPO 对象文件将包含 和
user1
。user2
问题是,稍后user1
尝试将文件推送到 GIT HOST时object
,创建的文件和目录可能包含 ,user2
因此会出现以下错误。error: insufficient permission for adding an object to repository database ./objects fatal: failed to write object error: unpack failed: unpack-objects abnormal exit ! [remote rejected] master -> master (n/a (unpacker error)) error: failed to push some refs to [email protected]:/home/git/myproj
解决方案是配置 git bare repo,以便任何用户都可以读取/写入任何其他用户创建的文件。 下一步使用
UNIX GROUP
权限即可完成此操作。设置 REPO,以便不同的用户可以访问 git repo。
创建一个所有用户都可以加入的群组
sudo vi /etc/group git:x:4001:user1,user2
更改所有文件,以便它们正确地位于新创建的组中。
cd /local/git-repos/repo1.git sudo chgrp -R git objects sudo chmod -R g+rws objects
使用您上面创建的任何共享组(
git
在此示例中)。
注意:group-suid 位很重要,因为它会导致将来创建的文件/目录保留与父目录相同的设置。从https://www.redhat.com/sysadmin/suid-sgid-sticky-bit, 它说:
如果在目录中设置,则在该目录中创建的任何文件的组所有权都将设置为目录所有者的组所有权
概括
此错误通常不会发生在任何正常托管的 GIT REPO 上。但它可能发生在所描述的情况下,即设置私有(基于文件)存储库并由多个用户共享。