クローンされたリポジトリを使用して、リモート ブランチにプッシュしようとしています。コミットは問題なく動作しますが、プッシュしようとすると、次のエラーが発生します。
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 もそれを使用していました。
以下は私がこれを設定するために使用した手順であり、適切な場所で問題が発生する場所を説明します。
私は user1@host1 です。次を使用して bare git リポジトリを作成します。
mkdir /local/git-repos cd /local/git-repos git init --bare repo1.git
Git リポジトリに使用される名前が論理名になるように、~/.ssh/config ファイルを設定します。こうすることで、ボックスを別のマシンに移動する場合、ホスト エイリアスを新しいコンピューター名に更新するだけで済みます。
ファイル:
$HOME/.ssh/config
Host mygithost HostName host1
次にリポジトリをクローンします
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リポジトリに送信されます
ユーザー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
。さまざまなユーザーが 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 リポジトリでは通常発生しません。ただし、プライベート (ファイルベース) リポジトリが設定され、複数のユーザーによって共有されている状況では発生する可能性があります。