web-dev-qa-db-ja.com

gitリポジトリを読み取り専用にする方法は?

SSH経由でリモートからアクセスするgitリポジトリがいくつかあり、それらの一部を読み取り専用にして、プッシュが増えないようにします。一部の人々は、これらのリポジトリを指すリモートを持っています。

これらのベアリポジトリは初期化されました--shared=groupでは、すべてのファイルのファイル許可を660に設定しても、SSHアクセスは許可されますが、書き込みは許可されませんか?それとも簡単な方法はありますか?

乾杯。

50
Steve Folly

これを行うには、複数の方法があります。

  • ユーザーがそれぞれシェルアカウント(おそらく制限されている)を持ち、それぞれが自分のアカウント経由でgitリポジトリにアクセスする場合、filesystem permissionsを使用してgitリポジトリへのSSHアクセスを制御できます。 Unixでは、ディレクトリに対する書き込みアクセス許可になります。おそらく、グループの作成とグループの特定のアクセス許可(「スティッキグループID」セット)が役立ちます。

  • プッシュするにはgit-receive-packがユーザーの$ PATHに存在し、それらに対して実行可能であることが必要です...

  • updateまたはpre-receive hookを使用して、リポジトリへのアクセス制御を行うことができます。たとえば、gitソースのcontrib/hooksからの update-paranoid フックの例を使用します。

  • より多くのユーザーがいる場合は、gitリポジトリへのアクセスを管理するツールを使用すると、より良い可能性があります Gitosis (Pythonではsetuptoolsが必要)または Gitolite (Perlで)。

  • 読み取り専用アクセスの場合、git daemonを設定して、SSHプロトコル経由のアクセスの代わりにgit://プロトコル経由で読み取り専用の匿名(および認証されていない)アクセスを提供できます。

    SSHからGITプロトコルへの移行を容易にする方法については、url.<base>.insteadOf構成変数のドキュメントを参照してください。


Scott Chaconによる Pro Git 本(CC-BY-NC-SAライセンス)の第4章「 Git on the Server 」も参照してください。

43
Jakub Narębski

pre-receiveフックは単に情報メッセージを出力し、ゼロ以外のステータスで終了するジョブを実行します。

メッセージに意味のある情報を入れると、欲求不満のユーザーがプッシュできない理由を尋ねるクエリも削減されます。

#!/bin/bash
echo "=================================================="
echo "This repository is no longer available for pushes."
echo "Please visit blah blah yadda yadda ...."
echo "=================================================="
exit 1

スクリプトの実行権限を設定し、正しいユーザーおよび/またはグループが所有していることを確認してください。そうしないと、実行されず、警告も表示されません。

10
Dale Anderson
chmod -R a-w /path/to/repo.git
9
Pat Notz

Gitは主にアクセス制御のためにファイルシステムに依存しているため、動作します。あなたの許可では、ワールドはファイルにアクセスできませんが、ユーザーとグループには読み取り/書き込みアクセスがあります。誰でも読めるようにするには、許可を0444にする必要があります。

ユーザーがnobodyで、グループがgitdevsのような0664としてリポジトリ権限を設定することにより、さらにきめ細かな制御を行うことができます。そうすると、gitdevsグループの人々だけがレポに書き込むことができますが、世界はそこから読むことができます。

フォローアップここにリンクがあります レポを共有するさまざまな方法をカバーし、プロの長所と短所、アクセス制御機能をカバーします。

3
jheddings

このコメント に触発された:

  1. hooks/pre-receiveファイルを次のコンテンツで更新します。

    #!/bin/sh
    
    echo "Closed for all pushes" ; exit 1
    

このように、このレポジトリへの変更をプッシュしようとするすべてのユーザーは上記のメッセージを受け取り、プッシュは拒否されます。

2
Per Lundberg

私はGitLabの単なるユーザーであるため(最初のステップで管理者を煩わせたくありませんでした)、別の方法で検索して見つけました。

  • GitLab Webインターフェイスを開き、読み取り専用に設定するリポジトリに移動します
  • 設定>リポジトリを選択します
  • 展開保護されたブランチ
  • マスターブランチを追加し、-マージを許可およびプッシュを許可No oneに設定します
  • マスターブランチが既に保護されている場合は、以下のリストでこれらの値を設定できます
1
Nicolas

アクセス制御も必要な場合は、 gitosis を確認してください。設定は非常に簡単で、簡単なスクリプトを使用して誰が何を実行できるかを制御できます。

1
Makis

もう1つの可能性はgitプロトコルですが、gitデーモンが実行されている必要があります。

0
Ikke

最近、「/ repo.git/git-receive-pack」パスへのアクセスを制限して、リポジトリが一部のユーザーに対して読み取り/書き込みであり、一部のユーザーに対して読み取り専用であるという結果を達成しました。 httpd configでは、次のようになります。

    <Location /repo.git/>
            Require group developers developers-ro
    </Location>

    <Location /repo.git/git-receive-pack>
            Require group developers
    </Location>
0
keypress