web-dev-qa-db-ja.com

マシン上の複数のユーザーとGitリポジトリを共有するにはどうすればよいですか?

複数の開発者がプルできるようにする必要があるステージングサーバーにGitリポジトリがあります。 git-init は私が探しているものに非常に近いフラグを持っているようです:--shared。ただし、複数の人がそのリポジトリにプルしたい場合も除きます。 git-clone--sharedフラグは、まったく異なる処理を行います。

既存のリポジトリの権限を変更する最も簡単な方法は何ですか?

217
Andrey Fedorov

許可は害虫です。

基本的に、それらすべての開発者がgitリポジトリ内のすべてに書き込みできることを確認する必要があります。

開発者のグループに書き込み機能を許可する優れた方法については、New-Waveソリューションにスキップしてください。

標準ソリューション

すべての開発者を特別に作成されたグループに配置する場合、原則として、次のことを実行できます。

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

次に、ユーザーのumask002に変更します。これにより、グループが書き込み可能な権限で新しいファイルが作成されます。

これに関する問題は軍団です。 umask022を前提とするディストリビューションを使用している場合(デフォルトで全員を含む共通のusersグループを持っているなど)、これにより他の場所でセキュリティの問題が発生する可能性があります。そして、遅かれ早かれ、注意深く作成されたアクセス許可スキームがなんらかの形で台無しになり、rootアクセスが取得されて修正されるまで(つまり、上記のコマンドを再実行するまで)、リポジトリは動作しなくなります。

ニューウェーブソリューション

あまりよく理解されていませんが、OS /ツールのサポートが少し必要な優れたソリューションは、POSIX拡張属性を使用することです。最近この地域に来たばかりなので、ここでの知識はそれほど熱くありません。ただし、基本的には、拡張ACLとは、3つのデフォルトスロット(ユーザー/グループ/その他)以外にも権限を設定する機能です。

もう一度、グループを作成して、次を実行:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

これにより、グループの拡張ACLが設定され、グループメンバーはすでにそこにあるすべてのファイル(最初の行)を読み取り/書き込み/アクセスできます。次に、既存のすべてのディレクトリに、新しいファイルにも同じACLを適用するように指示します(2行目)。

あなたがあなたの道に行くことを願っています。

193
womble

リポジトリを作成した場合(または既存のリポジトリから新しいベアリポジトリを複製した場合)

$ git init --shared=group 

または

$ git init --shared=0NNN

Gitは、デフォルトのumaskが提供する以上の権限を処理することになっています。ついに、これは私のバージョンのGit(1.6.3)にも当てはまります。もちろん、これはユーザーが同じグループに属していることを前提としています。

ただし、読み取り/書き込みの程度が異なる複数のグループのユーザーを管理する必要がある場合は、gitosisを使用します。また、ブランチレベルのアクセス許可を提供することを前提としたGitosisフォークであるgitolite( http://github.com/sitaramc/gitolite )についての言及も聞いたことがあります。個人的に。

122
user35117

これは言われていないので、早急に追加したいと思います。

権限の問題によって醜い頭が切り取られないようにするには、git共有リポジトリの構成ファイルで次のように設定してください。

[core]
    sharedRepository = true

これにより、システムの「umask」設定が確実に尊重されます。

55
Niels Joubert

Git User Manualリポジトリを共有する の方法をいくつかの方法で説明しています。

より複雑ですが、機能をフルに使用してリポジトリを共有する方法は次のとおりです。

6人の開発者のチームにGitHubを使用しています。

22
jtimberman

Gitリポジトリのホスティングについては gitolite も参照してください。グリトーシスはもう開発されていないようです。

9
mt3

共有リポジトリの権限を修正して、ユーザーがプッシュするときに権限の問題が発生しないようにする1つの方法は、それを行う更新後フックスクリプトを作成することです。これはどのgitバージョンでも機能するはずです。

/myrepo.gitに共有リポジトリがあるとします。そのリポジトリ内のすべてのファイルは、たとえばmysharedgroupに属しています。そのリポジトリにプッシュするすべてのユーザーはmysharedgroupにも属している必要があります。次のファイルを作成します(mysharedgroupを好みに変更します)。

/ myrepo.git/hooks/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
4
bkmks

新しいリポジトリの設定に関する他のさまざまな回答やコメントからの良いアドバイスの断片を集めるには:

グループmyrepo/srv/gitに新しいリポジトリmygroupを設定する場合は、次のようにします。

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. 最初の行はリポジトリディレクトリを作成します
  2. 2行目は、グループをmygroupに設定します
  3. 3行目は、次の構成でベアリポジトリを初期化します。
    1. core.bare = true:最小限のリポジトリにします
    2. core.sharedrepository = 1core.sharedrepository = groupと同じ):repoディレクトリとその中に後で作成されるすべてのディレクトリは、mygroupの読み取り、書き込み、および実行権限を許可するためにgitによって管理されます(sgidビットを使用)同様に設定-mygroupがプライマリグループではないユーザーと連携するため)
    3. receive.denyNonFastforwards = 1:リポジトリへの早送り以外のプッシュを拒否します

ユーザー、グループ、または他のユーザーの権限を微調整する場合は、--shared=0NNNを使用します。ここで、NNNfilesの標準ユーザー、グループ、およびその他のビットです=(directoriesの実行ビットとsgidビットはgitによって適切に管理されます)。たとえば、これにより、ユーザーには読み取りおよび書き込みアクセスが許可され、グループには読み取り専用アクセスが許可されます(他のユーザーにはアクセスできません)。

git init --bare --shared=0640 /srv/git/myrepo.git

これにより、ユーザーとグループへの読み取りおよび書き込みアクセスが許可されます(他へのアクセスは許可されません)。

git init --bare --shared=0660 /srv/git/myrepo.git

これにより、ユーザーとグループには読み取りと書き込みのアクセスが許可され、その他には読み取り専用のアクセスが許可されます。

git init --bare --shared=0664 /srv/git/myrepo.git

グループへの書き込みアクセスを許可しない場合は、まずchownを使用してリポジトリの所有者を設定し、次にそのユーザーとしてgit initコマンドを実行してください(すべての初期ファイルとサブディレクトリの正しい所有者でリポジトリが初期化されていることを確認してください)。

3
Justin Ludwig

Git-daemonを使用してリポジトリを共有できます。詳細は git-daemon のドキュメントをご覧ください。

編集:

この記事もチェックしてください gitリポジトリを共有する8つの方法

2
Vihang D

これを正確に行うことは、既存のリポジトリに対して私にとってうまくいきました。これは、前にいくつかの回答とコメントからアドバイスを受け取ります:

サーバーのリポジトリの親ディレクトリから:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group
1
Luis de Arquer

@stevek_mccの回答は、この質問をググったときに探していたものです

git clone --config core.sharedRepository=true
0
ragerdl