1. ホーム
  2. git

[解決済み】Git Push Error: リポジトリデータベースにオブジェクトを追加する権限が不足しています。

2022-01-27 08:14:12

質問

共有の git リモートにプッシュしようとすると、以下のエラーが発生します。 insufficient permission for adding an object to repository database

そして、ここで修正方法を読みました。 修正 これは、すべてのファイルが正しいグループであったため、次のプッシュではうまくいきました。しかし、次に誰かが変更をプッシュすると、objects フォルダにその人のデフォルトグループをグループとする新しいアイテムが作成されました。唯一考えられるのは、開発者がチェックインするアイテムのデフォルトグループをすべて変更することですが、これはハッキングのように思えます。 何かアイデアはありませんか?ありがとうございます。

解決方法は?

パーミッションの修復

根本的な原因(下記参照)を特定し、修正した後、パーミッションを修復します。

cd /path/to/repo.git
sudo chgrp -R groupname .
sudo chmod -R g+rwX .
sudo find . -type d -exec chmod g+s '{}' +

誰もがリポジトリを変更できるようにしたい場合は、このように chgrp に変更し、chmod を sudo chmod -R a+rwX .

根本的な原因を解決しないと、何度もエラーが発生し、上記のコマンドを何度も再実行する必要があります。

根本的な原因

エラーの原因は、以下のいずれかである可能性があります。

  • リポジトリが共有リポジトリとして設定されていない ( core.sharedRepositorygit help config ). という出力があれば

     git config core.sharedRepository
    
    

    group または true または 1 などのマスクをつけて、実行してみてください。

     git config core.sharedRepository group
    
    

    を再実行し、再帰的な chmodchgrp (上記の "Repair Permissions" を参照)。

  • オペレーティングシステムは、ディレクトリの setgid ビットを "すべての新しいファイルとサブディレクトリはグループオーナーを継承する必要があります" として解釈しません。

    いつ core.sharedRepositorytrue または group , Gitは、新しく作成されたサブディレクトリが正しいグループ(リポジトリのすべてのユーザーが属しているグループ)によって所有されることを保証するために、GNUオペレーティングシステム(例えば、すべてのLinuxディストリビューション)の機能に依存しています。 この機能についてのドキュメントは GNU coreutils ドキュメント :

    <ブロッククオート

    ... [ディレクトリの set-group-ID ビットが設定されている場合、新しく作成されたサブファイルはディレクトリと同じグループを継承し、新しく作成されたサブディレクトリは親ディレクトリの set-group-ID ビットを継承します。... [この機構により,ユーザはより簡単にファイルを共有することができます. chmod または chown をクリックすると、新しいファイルを共有できます。

    しかし、すべてのOSにこの機能があるわけではありません(NetBSDがその一例です)。 そのようなオペレーティング・システムでは、すべてのGitユーザーが同じデフォルト・グループを持っていることを確認する必要があります。 あるいは、次のコマンドを実行することで、リポジトリを世界的に書き込み可能にすることができます。 git config core.sharedRepository world (ただし、安全性に欠けるので注意が必要です)。

  • ファイルシステムが setgid ビットをサポートしていない (例: FAT) ext2、ext3、ext4 はすべて setgid ビットをサポートしています。 私の知る限り、setgid ビットをサポートしていないファイルシステムは、グループオーナーシップの概念もサポートしていないので、すべてのファイルとディレクトリは、とにかく同じグループによって所有されます (どのグループがマウントオプションなのか)。 この場合、すべてのGitユーザーが、ファイルシステム内のすべてのファイルを所有するグループに属していることを確認してください。

  • すべてのGitユーザーが、リポジトリ・ディレクトリを所有する同じグループに属しているわけではありません。 ディレクトリのグループオーナーが正しく、すべてのユーザーがそのグループに属していることを確認しましょう。