17

問題:複数のユーザーが同じ作業ディレクトリにアクセスできる場合、git操作が実行されると、メタデータでアクセス許可の問題が発生する可能性があります。

免責事項:あなたが私を懲らしめる前に-作業ディレクトリを共有することはGitの略であり、この共有ディレクトリで読み取り専用操作以外のことをすることについて話しているのではないことを理解しています-私たちはすべての作業を自分のローカルリポジトリで行います。

私たちのアプローチは確かにベストプラクティスではないため、私たちがやろうとしていることを行う別の方法についての提案を受け入れていますが、他の人が聞くのに役立つ会話かどうかはわかりません。だから今のところ、私たちがこれをしている理由についていくつかの詳細を提供しましょう:

私たちのチームにはいくつかのビルドマスターがいます。Linuxサーバーにデプロイし、Gitから直接プルするビルドスクリプトを使用して、そこでビルドを実行します。現時点ではCI(Jenkins / Cruisecontrolなど)を使用できないため、チェックアウトしてQAビルドを実行するリポジトリがあります。

スクリプトの一部として実行するgit操作がいくつかあります。これには、コミットのタグ付けが含まれます(QA-current、QA-previousなどとしてタグ付けされます)。ですから、私たちは実際には完全に読み取り専用ではないと思います。ビルドスクリプトの性質上sudo、共通ユーザーとして実行します(そのユーザーをDevAdminと呼びましょう)。これは悪い習慣である可能性があり、共有レポチェックアウトを使用する必要があるため、おそらく苦痛の原因であると思います。

その作業ディレクトリにいるときに常にsudoされていれば、これはすべて問題ありません。問題は、git pullDevAdminとしてsudoされることなく、偶然に、または同様のことを行うことがあるということです。したがって、のほとんどのファイルは.gitDevAdmin(最初のクローンを実行した)によって所有されますが、これを行うと.git/objects、特定のユーザーが所有するファイルを含むdirが作成されます。そして、これらはグループ書き込み不可として作成されます。ORIG_HEADたとえば、所有権が間違っていることにも気づきました。したがって、DevAdminとして何かを行おうとすると、問題が発生します。

この問題を解決するためにできることはありますか?今のところ、それが発生したことを認識してから、サーバー管理者にchown .gitDevAdminに戻るように依頼する必要があります。または、問題のメタファイルを削除するか、少なくともchmodグループ書き込み可能にするようにユーザーに依頼します。これはすべて非常に悪いようです。

ビルドとメンテナンスのプロセスを大幅に変更する必要のないいくつかのオプションを検討しました。

グループ書き込みアクセスを削除.gitしてDevAdminに制限した場合、これが再び発生するのを防ぐことができますか?これは最も簡単なオプションのようです。

.giまたは、新しく作成された場合でも、tグループ内のすべてを書き込み可能にする方法はありますか?これはトラブルからの質問のようです。

私が見逃している明らかな何かが他にありますか?ユーザーが自分のリポジトリで作業できるようにプロセスを変更するのがおそらく最善の方法だと思いますが、ビジネス環境では、リポジトリが非常に大きくなる可能性があります(jarがまだ分離されていない、大量のバイナリファイルなど) ...)、すべてのアカウントにマルチGBリポジトリを設定することはできません。さらに、システム管理者は、それを可能にするためにプロセスを変更する前に、多くの作業を行う必要があります。

どんな考えでもありがたいです。

4

3 に答える 3

30

この問題に対処する方法はいくつかあります。個人的には、既存のリポジトリで次のことをお勧めします。

# Create a group named "gitshare" that will share the repository.
sudo groupadd gitshare

# Add yourself and as many others as you want to the group.
sudo adduser "$LOGNAME" gitshare

# Everything else needs to run from the top level of your Git repository.
cd /path/to/repository

# Add group permissions for *new* modifications to repository.
git init --shared=group

# Fix permissions for existing repository objects.
chown -R :gitshare "$PWD"
chmod -R g+swX "$PWD" 

明らかに、ユーザーがリポジトリへのディレクトリトラバーサル権限を持っていること(たとえば、ユーザープライベートディレクトリが問題を引き起こす可能性がある)、およびアクセスが必要なすべてのチームメンバーがリポジトリの共有グループに属していることを確認する必要があります。ただし、この初期設定の後は、「正常に機能する」はずです。

于 2012-06-25T23:38:59.513 に答える
2

私はちょうどこの問題に直面し、それがとても単純だったときに解決策を見つけるのに何時間もかかりました。CodeGnomeが提供する他のリンクに表示されるほとんどすべてを試しました。

私はCentos6.xを使用していますが、解決策はユーザーのumaskを変更することでした...これには各アカウントで行う必要があります...同じディレクトリで作業しているのは2人だけです。それほど苦痛ではありません。

私のために働いた解決策は、サーバーの構成を変更することなく、これです: http ://www.avajava.com/tutorials/lessons/how-do-i-set-the-default-file-and-directory-権限.html

私の場合のように、.bashrcfiloeが/home / userディレクトリに存在しない場合は、スケルトンから/ ect / skel内のファイルをコピーし、追加後にホーム(users)ディレクトリにコピーするだけです。ファイルの最後に:

umask 002

これにより、ユーザーはグループ内の他のユーザーによって作成された新しいフォルダーでchmod775を使用できます。もちろん、このプロジェクトが完了したら、テスト環境ではなくなり、デフォルトでchmod 755(umask 022)に戻します。これにより、Gitに上書きの許可を与えるだけでなく、許可が拒否される問題を発生させることなく、sFTPにアップロードされたファイルを書き込むことができます。。

于 2016-09-21T05:02:58.453 に答える
0

9年後にGoogleで検索したときにここにたどり着きましたが、特定のユースケースに対応する新しいソリューションを思いついたと思います。


解決策:リモートリポジトリで、グループに書き込みと実行のアクセス許可を付与するフックを作成しました。フックは、リモートリポジトリのディレクトリ内のディレクトリの下にhooksあり、名前が付けられpost-receiveています(ファイル拡張子はありません。手動でファイルを作成し、実行権限を付与する必要がありました)。bash次のようなスクリプトとして作成しました。

#!/bin/sh
chmod -R g+rwx /path/to/remote/repo

関係するすべてのユーザーは同じグループの一部であり、gitフックはプッシュを行ったユーザーとして実行されます。そのため、ユーザーは基本的にアクセスできるファイル変更し、グループ内の他のユーザーがアクセスできるようにします。


状況:職場では、定期的に更新および調整される数十年分のプログラムを含むフォルダーがありました。バージョン管理が必要なため、(同じマシン上に)リモートをセットアップし、git init問題のフォルダーを編集してリモートに向けました。私たちの冒険心が強い人は、リポジトリをラップトップに複製してそこでコードベースで作業し、変更をプッシュしたいと思っていましたが、冒険心が少ない人はフェッチ/プルする必要がないことを望んでいました。リポジトリは元のコードベースと同じマシン上にあるため、変更を自動的に伝播するgitフックを作成しました。

サーバーの所有者は権限について適切に厳格であるため、(共有)グループが書き込み権限を自動的に取得しないumaskポリシーが作成されます。また、私たちはsudoersではないので、強制的に動作させることはできません(いわば)。

ガッチャ」:

  • ファイルのアクセス許可が原因でプッシュできない状況になっている場合は、各ユーザーにアクセス許可を付与してもらいます(chmod -R g+rwx /path/to/remote/repo)。アクセスできないファイルについてはエラーが発生しますが、それは問題ありません。みんながそれをやったら、あなたは行ってもいいはずです:)
  • これはOPには関係ありませんが、私たちの状況では、ローカルクローン内にフックfetch + pullがあり、クローンの.gitディレクトリコンテンツのアクセス許可も更新されました。もともとその最後の部分を忘れていました:|

免責事項:私は、セキュリティ、Linux、またはgitのいずれのプロでもありません。私はそれを私が持っている範囲と制限の範囲内で機能させるのに十分知っていましたが、もっと良い方法があると確信しています。


うまくいけば、これは他の誰かを助けるでしょう、そして私が用語のいずれかを間違えたら申し訳ありません!

于 2021-10-19T20:04:56.763 に答える