今日、自分で構築した Git サーバーに push したところ、次のエラーに遭遇しました。
remote: error: insufficient permission for adding an object to repository database ./objects
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To git@127.0.0.1:/srv/git-server/checkpoint.git
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'git@127.0.0.1:/srv/git-server/checkpoint.git'
最初は Google で調べても適切な解決方法が見つかりませんでしたが、最終的に、リポジトリを初期化したときに権限設定を間違えていたことが原因だと分かりました。
bare リポジトリを作成した後は、リポジトリディレクトリとその中のファイルすべての所有者を Git ユーザーに変更する必要があります。当時 chown を実行した際に -R オプションを付け忘れていたため、ディレクトリ配下のファイルの所有者が再帰的に変更されていませんでした。その結果、Git がオブジェクトを書き込むときに権限不足で失敗していました。
修正方法は次のとおりです。
sudo chown -R git:git repositoryname.git
リポジトリのパスが /srv/git-server/checkpoint.git の場合は、次のように実行します。
sudo chown -R git:git /srv/git-server/checkpoint.git
その後、もう一度 push すれば完了です。
先に現在の権限を確認しておくこともできます。
ls -la /srv/git-server/checkpoint.git
ls -la /srv/git-server/checkpoint.git/objects
リポジトリディレクトリと objects ディレクトリの両方が git:git 所有になっていることを確認します。
