Git push 无法写入目标文件-权限被拒绝

Git push 无法写入目标文件-权限被拒绝

我在一个克隆的仓库上,试图推送到我的远程分支。提交工作正常,但是每当我尝试推送时,都会收到以下信息:

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 也在使用它。

下面是我用来设置的步骤,并在适当的地方解释了问题发生的位置。

  1. 我是 user1@host1,我使用以下命令创建了一个裸 git repo:

    mkdir /local/git-repos
    cd /local/git-repos
    git init --bare repo1.git
    
  2. 我设置了一个 ~/.ssh/config 文件,以便 git repo 使用的名称是一个合乎逻辑的名称。这样做是为了如果我将我的机器移到另一台机器上,我所要做的就是将我的主机别名更新为新的计算机名称。

    文件:$HOME/.ssh/config

    Host mygithost
        HostName host1
    
  3. 然后我使用克隆仓库

    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

  4. 设置用户 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 对象文件将包含 和user1user2问题是,稍后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权限即可完成此操作。

  5. 设置 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 上。但它可能发生在所描述的情况下,即设置私有(基于文件)存储库并由多个用户共享。

相关内容