特定のディレクトリの既存または将来のサブディレクトリにある特定のユーザーに読み取り/書き込みを許可するにはどうすればよいですか?


8

VPSで自分のgitリポジトリをホストしています。私のユーザーがジョンだとしましょう。

私はsshプロトコルを使用してgitリポジトリにアクセスしているので、URLはのようになりssh://john@myserver.com/path/to/git/myrepo/ます。

ルートは、すべての所有者です /path/to/git

私は下にあるすべてのものにジョンへの読み取り/書き込みアクセス権を与えようとしています /path/to/git/myrepo

私は両方chmodを試してsetfaclアクセスを制御しようとしましたが、どちらも同じように失敗します。それらは、の現在のすべての既存のサブディレクトリに(正しいオプションで)権限を再帰的に適用します/path/to/git/myrepoが、新しいディレクトリが作成されるとすぐに、ユーザーは書き込みできません新しいディレクトリ。

gitには、各コミット後に権利を再適用できるフックがあることは知っていますが、これは非常に基本的な目的には複雑すぎるため、間違った方向に進んでいると思い始めています。

Q:rwにjohnへのアクセス権を付与し、/path/to/git/myrepoツリー構造の変更に耐性を持たせるには、どうすればよいですか?

Q2:一般的なアプローチを変更する必要がある場合は、教えてください。

編集:質問はそのまま回答されましたが、それは間違った質問でした。正しい質問は、「sshアクセスで使用するためにサーバー上で裸のgitリポジトリを構成する方法」でしょう。私自身の答えを見てください。

回答:


5

myrepousersたとえば、グループを作成し、gitユーザーをそのグループに追加します。

次に、/ path / to / git / myrepoの下にあるすべてのグループをmyrepousersに変更します。

chown -R .myrepousers /path/to/git/myrepo

次に、権限を修正します。

chmod -R g+w /path/to/git/myrepo
find /path/to/git/myrepo -type d -exec chmod -R {} g+s \;

すべて設定する必要があります。


2
ここで何が起こっているのかを理解したい場合は、「setgid」のグーグル、サミュエル。ここでの魔法はにありg+sます。もちろん、最初にchmodあまりにも基本を理解する必要があります。
iconoclast 2012

ディレクトリで+ sを使用してそれを行う方法を理解していると思いましたが、期待したとおりにはいきませんでした。アクセス許可が新しいディレクトリに送信されませんでした。最後のトークンと3番目の最後のトークンの意味:{}と\よろしくお願いします。
サミュエルロッシル

{}-は、ファイル名置換のプレースホルダーです。;によって実行されるコマンドのターミネータです-exec;特別な意味を持っている中でbash、それは\でエスケープする必要があります。詳細man findはこちら
Serge

4

実際、それは間違ったアプローチでした。追加の調査の結果、リポジトリではファイルシステムの権利を処理するために、gitのビルドイン機能を使用する必要があることがわかりました。

それは基本的にのsharedオプションで行われ、git init(とりわけ)以下の値を持つことができます:

  • group:リポジトリを初期化して、ファイルとディレクトリにユーザーとグループの書き込みアクセス権を与え、他の全員に読み取りアクセス権を与える
  • 0660:同じですが、他のユーザーの読み取りアクセス権はありません。

新しく作成されたディレクトリとファイルには、適切な権限が自動的に付与されます。git init既存のリポジトリを使用して、コンテンツを失うことなく再構成することもできます。

結局私がしなければならなかったこと:

  • グループを作成する mygitrepo
  • ユーザーを追加する
  • chmod -R gitリポジトリ root:mygitrepo

そして今、グループのすべてのユーザーはプル/プッシュできますが、他の誰もできません。それは、ファイルシステムの権限をいじることなく可能です。

git init --bare --shared=0660

詳細については、http://www.kernel.org/pub/software/scm/git/docs/git-init.htmlをご覧ください。


2

ACLがサポートされている場合は、デフォルトのACLを使用して実行できます。それらを実行しても表示されないため、それらのことは忘れがちですls -l

find /path/to/git/myrepo -type d -exec setfacl -m d:u:john:rwx {} +

しかし、あなたはもう少し整理された何かをしたいと思うかもしれません。ギトライトを展開すると、より良いソリューションが提供される場合があります。


1
DebianのWheezyにさんを有する少なくともls(と私はあまりにもスクイズ思う)あなたが得る+言うべき権限の終わりにACLがあります:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert

これでうまくいきましたが、最後の2つのトークンの意味を明確にしてもらえますか:{} +
Samuel Rossille

だとfind ... -exec cmd {} +構文、{}多くのように置き換えられFOUNDの(にoppsedできるだけファイル名{} \;場所{}だけ一度に一つ見つかったファイルに置き換えられます)
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.