共有gitリモートにプッシュしようとすると、次のエラーが発生します。insufficient permission for adding an object to repository database
それから私はここで修正について読みます: 修正 すべてのファイルが正しいグループのものだったのでこれは次のPushのために働きました、しかし誰かが変更をプッシュしたときそれはobjectsフォルダに新しいアイテムを作りましたグループとしてデフォルトグループがありました。私が考えることができる唯一のことは彼らがチェックインするアイテムのために開発者のデフォルトグループの全てを変えることですが、それはハックのように思えます。何か案は?ありがとう。
根本的な原因を特定して修正した後(下記参照)、アクセス許可を修復します。
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.sharedRepository
のgit help config
を参照)。出力が
git config core.sharedRepository
group
でもtrue
でも1
でもマスクでもない場合は、次のコマンドを実行してみてください。
git config core.sharedRepository group
その後、再帰的なchmod
とchgrp
を再実行します(上記の「アクセス許可の修復」を参照)。
オペレーティングシステムは、ディレクトリのsetgidビットを「すべての新しいファイルとサブディレクトリはグループの所有者を継承する必要がある」と解釈しません。
core.sharedRepository
がtrue
またはgroup
の場合、GitはGNUオペレーティングシステムの機能(たとえば、すべてのLinuxディストリビューション)に依存して、新しく作成されたサブディレクトリが正しいグループ(すべてのリポジトリユーザーのグループにあります)。この機能は GNU coreutilsのドキュメントに文書化されています :
ディレクトリのセットグループIDビットが設定されている場合、新しく作成されたサブファイルはディレクトリと同じグループを継承し、新しく作成されたサブディレクトリは親ディレクトリのセットグループIDビットを継承します。 ... [このメカニズムは]新しいファイルを共有するために
chmod
またはchown
を使用する必要性を減らすことによって、ユーザーがファイルをより簡単に共有できるようにします。
しかし、すべてのオペレーティングシステムがこの機能を持っているわけではありません(NetBSDはその一例です)。これらのオペレーティングシステムでは、すべてのGitユーザーが同じデフォルトグループを持つようにする必要があります。あるいは、git config core.sharedRepository world
を実行することでリポジトリをワールドライタブルにすることもできます(ただし、注意してください - これは安全性が低下します)。
Ubuntu(または任意のLinux)用
プロジェクトルートから
cd .git/objects
ls -al
Sudo chown -R yourname:yourgroup *
そのls -alコマンドからの出力の大部分に関する許可を調べることによって、自分の名前と自分のグループが何であるべきかを知ることができます。
注:Sudo行の終わりにある星を覚えておいてください
Sudo chmod -R ug+w .;
基本的に、.git/objects
ファイルには書き込み権限がありません。上記の行は、ディレクトリ内のすべてのファイルとフォルダに対する権限を付与します。
私は自分のソリューションを追加したいだけでした。私はあるディレクトリではrootの所有権を持ち、他のディレクトリではHome(これが私のユーザディレクトリです)を所有しているOS X上でリポジトリを作成しました。
解決策はありがたいことに簡単でした。ターミナルから:
Sudo chown -R Home projectdirectory
次のコマンドを使用して、魔法のように動作します
Sudo chown -R "${USER:-$(id -un)}" .
そのままコマンドを入力します(余分なスペースと末尾に1つのドットが付きます)。
これをデバッグするための良い方法は、次にリモートレポジトリにSSHでアクセスし、objectsフォルダにcdしてls -al
を実行することです。
あなたがこれとは異なるuser:groupの所有権を持つ2〜3のファイルを見れば問題です。
過去に私のgitレポジトリにアクセスするいくつかの古いスクリプトが発生しました。これは通常、別の(unix)ユーザーが最後にファイルをプッシュ/変更したことを意味します。すべてのgit対応ユーザーが入っている共有gitグループを作成してから、chgrp
フォルダーを再帰的にobjects
フォルダーに入れ、そのグループ所有権が共有git
グループになるようにする必要があります。
フォルダ内に作成されたすべてのファイルが常にgit
のグループを持つように、フォルダにスティッキービットを追加する必要もあります。
chmod g + sディレクトリ名
更新日:私はcore.sharedRepositoryについて知りませんでした。知っておくと便利ですが、おそらく上記のことをするだけです。
私のために解決した...ちょうどこれ:
Sudo chmod 777 -R .git/objects
変更をプッシュするときに使用する予定のユーザーとは異なるユーザーでgit init
を実行した場合、これは簡単に起こります。
あなたが盲目的に[1]の指示に従うならば、おそらくrootとしてgit-userを作成し、その間にユーザーを変更せずに直ちにgit initに移動したときに起こるでしょう。
[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server
いくつかのものを追加した後...それらをコミットし、すべてを終えた後それをプッシュしてください!バング!すべての問題から始めてください...お気付きのとおり、新規プロジェクトと既存プロジェクトの定義方法にはいくつかの違いがあります。他の誰かが同じファイルやコンテンツを追加/コミット/プッシュしようとした場合(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
Linux、macOS:
cd .git/
Sudo chown -R name:group *
name
はあなたのユーザー名、group
はあなたのユーザー名が属するグループです。
私の場合、提案はどれもうまくいきませんでした。私はWindows上にいます、そしてこれは私のために働きました:
git remote add foo //SERVERNAME/path/to/copied/git
)git Push foo master
。うまくいきましたか。すばらしいです!今動作していないレポを削除し、それを以前のものに変更します。権限と共有プロパティが同じであることを確認してください。私はこれと同じ問題にぶつかりました。このあたりを読んで、私はそれがメッセージが言及していたファイル許可であることに気づきました。私にとっての修正は、
/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にあります
プッシュ先のディレクトリに対する十分な書き込み権限が必要です。
私の場合: Windows 2008サーバ
gitリポジトリディレクトリまたは親ディレクトリを右クリックします。
[プロパティ]> [共有]タブ> [高度な共有]> [権限]>ユーザーに適切なアクセス権限があることを確認します。
同じエイリアスを持つ別のローカルリポジトリを追加した可能性もあります。例として、2つのローカルフォルダがOrigin
となっているので、プッシュしようとすると、リモートリポジトリはあなたの認証情報を受け入れません。
ローカルリポジトリのエイリアスの名前を変更するには、このリンクをたどることができます https://stackoverflow.com/a/26651835/2270348
たぶんあなたはあなたの好みの1つのローカルレポジトリをOrigin
として残して他の人はそれらを例えばOrigin
からanotherorigin
にリネームすることができます。これらは単なるエイリアスであり、あなたがする必要があるのは新しいエイリアスとそれぞれのリモートブランチを覚えていることだけであることを忘れないでください。
誤って 入れ子になったgitリポジトリ
私のために働く
Sudo chmod -R g+rwX .
Rstudioプロジェクトに引き込むときにこれを取得しました。私はするのを忘れていたことに気付きました:
Sudo rstudio
プログラムの起動時。実際、別のバグがあるので、実際に行う必要があります。
Sudo rstudio --no-sandbox