web-dev-qa-db-ja.com

Git Push Error:リポジトリデータベースにオブジェクトを追加するための十分な権限がありません

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

それから私はここで修正について読みます: 修正 すべてのファイルが正しいグループのものだったのでこれは次のPushのために働きました、しかし誰かが変更をプッシュしたときそれはobjectsフォルダに新しいアイテムを作りましたグループとしてデフォルトグループがありました。私が考えることができる唯一のことは彼らがチェックインするアイテムのために開発者のデフォルトグループの全てを変えることですが、それはハックのように思えます。何か案は?ありがとう。

523
skaz

修復権限

根本的な原因を特定して修正した後(下記参照)、アクセス許可を修復します。

cd /path/to/repo.git
Sudo chgrp -R groupname .
Sudo chmod -R g+rwX .
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を再実行します(上記の「アクセス許可の修復」を参照)。

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

    core.sharedRepositorytrueまたはgroupの場合、GitはGNUオペレーティングシステムの機能(たとえば、すべてのLinuxディストリビューション)に依存して、新しく作成されたサブディレクトリが正しいグループ(すべてのリポジトリユーザーのグループにあります)。この機能は GNU coreutilsのドキュメントに文書化されています

    ディレクトリのセットグループIDビットが設定されている場合、新しく作成されたサブファイルはディレクトリと同じグループを継承し、新しく作成されたサブディレクトリは親ディレクトリのセットグループIDビットを継承します。 ... [このメカニズムは]新しいファイルを共有するためにchmodまたはchownを使用する必要性を減らすことによって、ユーザーがファイルをより簡単に共有できるようにします。

    しかし、すべてのオペレーティングシステムがこの機能を持っているわけではありません(NetBSDはその一例です)。これらのオペレーティングシステムでは、すべてのGitユーザーが同じデフォルトグループを持つようにする必要があります。あるいは、git config core.sharedRepository worldを実行することでリポジトリをワールドライタブルにすることもできます(ただし、注意してください - これは安全性が低下します)。

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

Ubuntu(または任意のLinux)用

プロジェクトルートから

cd .git/objects
ls -al
Sudo chown -R yourname:yourgroup *

そのls -alコマンドからの出力の大部分に関する許可を調べることによって、自分の名前と自分のグループが何であるべきかを知ることができます。

注:Sudo行の終わりにある星を覚えておいてください

378
TerryS

Sudo chmod -R ug+w .;

基本的に、.git/objectsファイルには書き込み権限がありません。上記の行は、ディレクトリ内のすべてのファイルとフォルダに対する権限を付与します。

私は自分のソリューションを追加したいだけでした。私はあるディレクトリではrootの所有権を持ち、他のディレクトリではHome(これが私のユーザディレクトリです)を所有しているOS X上でリポジトリを作成しました。

解決策はありがたいことに簡単でした。ターミナルから:

Sudo chown -R Home projectdirectory
27
Brandon

次のコマンドを使用して、魔法のように動作します

Sudo chown -R "${USER:-$(id -un)}" .

そのままコマンドを入力します(余分なスペースと末尾に1つのドットが付きます)。

25
Code_Worm

これをデバッグするための良い方法は、次にリモートレポジトリにSSHでアクセスし、objectsフォルダにcdしてls -alを実行することです。

あなたがこれとは異なるuser:groupの所有権を持つ2〜3のファイルを見れば問題です。

過去に私のgitレポジトリにアクセスするいくつかの古いスクリプトが発生しました。これは通常、別の(unix)ユーザーが最後にファイルをプッシュ/変更したことを意味します。すべてのgit対応ユーザーが入っている共有gitグループを作成してから、chgrpフォルダーを再帰的にobjectsフォルダーに入れ、そのグループ所有権が共有gitグループになるようにする必要があります。

フォルダ内に作成されたすべてのファイルが常にgitのグループを持つように、フォルダにスティッキービットを追加する必要もあります。

chmod g + sディレクトリ名

更新日:私はcore.sharedRepositoryについて知りませんでした。知っておくと便利ですが、おそらく上記のことをするだけです。

17
Mauvis Ledford

私のために解決した...ちょうどこれ:

Sudo chmod 777 -R .git/objects
14
GUSTAVO BERBERT

変更をプッシュするときに使用する予定のユーザーとは異なるユーザーでgit initを実行した場合、これは簡単に起こります。

あなたが盲目的に[1]の指示に従うならば、おそらくrootとしてgit-userを作成し、その間にユーザーを変更せずに直ちにgit initに移動したときに起こるでしょう。

[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server

9
gitzor

いくつかのものを追加した後...それらをコミットし、すべてを終えた後それをプッシュしてください!バング!すべての問題から始めてください...お気付きのとおり、新規プロジェクトと既存プロジェクトの定義方法にはいくつかの違いがあります。他の誰かが同じファイルやコンテンツを追加/コミット/プッシュしようとした場合(gitは両方を同じオブジェクトとして保持します)、以下のエラーが発生します。

$ git Push
Counting objects: 31, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (21/21), 2.07 KiB | 0 bytes/s, done.
Total 21 (delta 12), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects  remote: fatal: failed to write object

この問題を解決するには、この場合は制限されているので、操作システムのパーミッションシステムに留意する必要があります。 Tuは問題をよく理解し、先に進んでgitオブジェクトのフォルダ(.git/objects)をチェックしてください。あなたはおそらくそのような何かを見るでしょう:

<your user_name>@<the machine name> objects]$ ls -la
total 200
drwxr-xr-x 25 <your user_name> <group_name> 2048 Feb 10 09:28 .
drwxr-xr-x  3 <his user_name> <group_name> 1024 Feb  3 15:06 ..
drwxr-xr-x  2 <his user_name> <group_name> 1024 Jan 31 13:39 02
drwxr-xr-x  2 <his user_name> <group_name> 1024 Feb  3 13:24 08

*これらのファイルのパーミッションはあなたのユーザーだけに与えられたもので、誰もそれを変更することはできません…*

Level       u   g   o
Permission rwx r-x ---
Binary     111 101 000
Octal       7   5   0

問題を解決する

スーパーユーザー権限を持っている場合は、手順2を使用して自分ですべての権限を先に進めて変更できます。それ以外の場合は、自分のユーザーで作成されたオブジェクトを持つすべてのユーザーに依頼します。 :

$ ls -la | awk '{print $3}' | sort -u 
<your user_name>
<his user_name>

これであなたとすべてのファイルの所有者ユーザはそれらのファイルのパーミッションを変更しなければならなくなります:

$ chmod -R 774 .

その後、新しいリポジトリに対して--shared = group doneと同等の新しいプロパティを追加する必要があります。ドキュメントによれば、これはリポジトリをグループ書き込み可能にし、実行します。

$ git config core.sharedRepository group

https://coderwall.com/p/8b3ksg

5
helmedeiros

Linux、macOS:

cd .git/
Sudo chown -R name:group *

nameはあなたのユーザー名、groupはあなたのユーザー名が属するグループです。

4

私の場合、提案はどれもうまくいきませんでした。私はWindows上にいます、そしてこれは私のために働きました:

  • リモートレポジトリを別のフォルダにコピーする
  • フォルダを共有し、適切な権限を与えます。
  • ローカルマシンからフォルダにアクセスできることを確認してください。
  • このリポジトリをローカルリポジトリの別のリモートリポジトリとして追加します。 (git remote add foo //SERVERNAME/path/to/copied/git
  • フーにプッシュします。 git Push foo master。うまくいきましたか。すばらしいです!今動作していないレポを削除し、それを以前のものに変更します。権限と共有プロパティが同じであることを確認してください。
3

私はこれと同じ問題にぶつかりました。このあたりを読んで、私はそれがメッセージが言及していたファイル許可であることに気づきました。私にとっての修正は、

/etc/inetd.d/git-gpv

ユーザー ' nobody 'としてgit-daemonを起動していたので、書き込み権限がありませんでした。

# Who   When    What
# GPV   20Nov13 Created this by hand while reading: http://linuxclues.blogspot.co.uk/2013/06>/git-daemon-ssh-create-repository-debian.html
# GPV   20Nov13 Changed owner (to user_git) otherise nobody lack permission to update the repository
#git stream tcp nowait nobody  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo
git stream tcp nowait user_git  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo

(他の人が自分のinetd設定ファイルをgit-gpvと呼ぶことは疑います。通常は直接/etc/inetd.confにあります

2
GraemeV

プッシュ先のディレクトリに対する十分な書き込み権限が必要です。

私の場合: Windows 2008サーバ

gitリポジトリディレクトリまたは親ディレクトリを右クリックします。

[プロパティ]> [共有]タブ> [高度な共有]> [権限]>ユーザーに適切なアクセス権限があることを確認します。

1
Fuyu Persimmon

同じエイリアスを持つ別のローカルリポジトリを追加した可能性もあります。例として、2つのローカルフォルダがOriginとなっているので、プッシュしようとすると、リモートリポジトリはあなたの認証情報を受け入れません。

ローカルリポジトリのエイリアスの名前を変更するには、このリンクをたどることができます https://stackoverflow.com/a/26651835/2270348

たぶんあなたはあなたの好みの1つのローカルレポジトリをOriginとして残して他の人はそれらを例えばOriginからanotheroriginにリネームすることができます。これらは単なるエイリアスであり、あなたがする必要があるのは新しいエイリアスとそれぞれのリモートブランチを覚えていることだけであることを忘れないでください。

1
Huey Mataruse

誤って 入れ子になったgitリポジトリ

1
IliasT

私のために働く

Sudo chmod -R g+rwX .
0
Nitin Tyagi

Rstudioプロジェクトに引き込むときにこれを取得しました。私はするのを忘れていたことに気付きました:

Sudo rstudio

プログラムの起動時。実際、別のバグがあるので、実際に行う必要があります。

Sudo rstudio --no-sandbox
0