Git プッシュはオブジェクト ファイルに書き込めません - 権限が拒否されました

Git プッシュはオブジェクト ファイルに書き込めません - 権限が拒否されました

クローンされたリポジトリを使用して、リモート ブランチにプッシュしようとしています。コミットは問題なく動作しますが、プッシュしようとすると、次のエラーが発生します。

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 リポジトリを保持しているホストで、次のコマンドを実行します。

cd /local/git-repos/repo1.git
sudo chgrp -R git objects
sudo chmod -R g+rws objects

私の場合はこれで問題は解決しました。参照記事では、リポジトリを共有リポジトリとして構成する方法について詳しく説明していますが、私はまだこれを実行していません。

git config core.sharedRepository group

なぜこのようなことが起こるのでしょうか? 興味があれば、読み進めてください。

なぜこのようなことが起こるのか

私の場合、私 (user1) が同僚と共有するプライベート Git リポジトリを設定したときにこの問題が発生しました。リポジトリは私のホスト (host1 とします) 上にあり、user2@host2 もそれを使用していました。

以下は私がこれを設定するために使用した手順であり、適切な場所で問題が発生する場所を説明します。

  1. 私は user1@host1 です。次を使用して bare git リポジトリを作成します。

    mkdir /local/git-repos
    cd /local/git-repos
    git init --bare repo1.git
    
  2. Git リポジトリに使用される名前が論理名になるように、~/.ssh/config ファイルを設定します。こうすることで、ボックスを別のマシンに移動する場合、ホスト エイリアスを新しいコンピューター名に更新するだけで済みます。

    ファイル:$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リポジトリに送信されます

  4. ユーザー2が同じGITリポジトリにアクセスできるように設定

    • user1 の場合と同じように、$HOME/.ssh/config ファイルを設定する必要があります。
    • ユーザーが自分自身として host1 に ssh できることを確認します。
    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 リポジトリを構成して、すべてのユーザーが他のユーザーが作成したファイルを読み書きできるようにすることです。 これは、権限を使用する次の手順で実行されますUNIX GROUP

  5. さまざまなユーザーが 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この例では)。

注意: グループsuidビットは、今後作成されるファイル/ディレクトリが親ディレクトリと同じ設定を保持するようにするため重要です。https://www.redhat.com/sysadmin/suid-sgid-sticky-bit、それは言う:

ディレクトリに設定すると、ディレクトリ内に作成されたファイルのグループ所有権はディレクトリ所有者のグループ所有権に設定されます。

まとめ

このエラーは、通常ホストされている GIT リポジトリでは通常発生しません。ただし、プライベート (ファイルベース) リポジトリが設定され、複数のユーザーによって共有されている状況では発生する可能性があります。

関連情報