0

私は次のセットアップを構成する任務を負っています。

現在、オープンソースプロジェクトの内部正規リポジトリがあります。公開されているリモートリポジトリに更新をプッシュする受信後フックがあります。

Joe Publicは、パブリックリポジトリからプルできます。

受信後のフックを除いて、誰もリモートリポジトリにプッシュしません

かなりの数のユーザーが内部でコードに取り組んでいます。私は、彼らがすでに作業しているワークフローをいじりたくありません。

内部ユーザーは、内部正規リポジトリからコードをチェックアウトし、同じものにコミットします。

外部の開発者はパッチを提出する必要があり、その後、内部のユーザーがパッチをコミットします(レビュー後)。

この時点で、一部の外部開発者がリポジトリへのコミットアクセスを許可できるようにします。

これは、リモートリポジトリを正規化することを意味します。

また、ユーザーのワークフローを変更することも意味します。ここの集団がgitに関して私が欠けている何かを思い付くことができない限り。

現在のワークフローのクイックダイアグラム。

内部ユーザー。

内部リポジトリからクローンを作成します。->コード付きのサル->内部リポジトリにプッシュ->リモートリポジトリにプッシュされた受信後フック。

外部ユーザー。

外部リポジトリからクローンを作成します。->コード付きのサル->メーリングリストを介してパッチを送信->内部ユーザーがコードを内部リポジトリにプッシュ->受信後フックがリモートリポジトリにプッシュ

理想的には新しいワークフロー!!

内部ユーザー。

内部リポジトリからクローンを作成します。->クローンが提供される前に、pre-receiveフックは、リモートから更新されたミラーがあることを確認します->コード付きのサル->内部リポジトリにプッシュします-> pre-receiveフックは、コミットをリモートリポジトリにプロキシし、2を同期します。

外部ユーザー。

リモートリポジトリからクローンを作成します。->コード付きのサル->リモートリポジトリにプッシュします。

これは、マルチマスターセットアップのようなものです。コードをいずれかのリポジトリにプッシュし、いずれかのリポジトリからコードをプルできる場所。

他のいくつかの警告。

内部リポジトリは、リモートリポジトリからプッシュおよびプルできます。リモートリポジトリは内部リポジトリに到達できません。

どう思いますか?

4

2 に答える 2

0

これは少し厄介なことになり、これを行うように設計されたツールがいくつかありますが、誰かがリポジトリに変更を加えるたびに、すべてのリポジトリを「ロック」することで機能します。あなたの場合、もっと簡単な方法があると思います。

  1. 全員がリモート リポジトリにプッシュします。内部ユーザーと外部ユーザーの両方。

  2. cron ジョブは、リモート リポジトリから内部リポジトリにプルします。

リモート リポジトリが で利用可能でssh://remote/dir/proj.git、内部リポジトリが で利用可能であるとしssh://internal/someplace/proj.gitます。みんなの に追加.gitconfig:

[url "ssh://remote/dir/"]
    pushInsteadOf = "ssh://internal/someplace/"

これは、内部リポジトリのクローンを作成した誰もが近くのサーバーからプルする速度を維持しながら、全員が同じリモート リポジトリにプッシュすることを意味します。全員のワークステーションで.gitconfigこのように設定したら、必要なのはand and -- 追加のフラグや構成の必要はありません。clonepushpull

このようなセットアップの唯一の本当の利点は、内部リポジトリからフェッチするときに得られる追加の速度であることに注意してください。cron ジョブの粒度によって、内部ユーザーが変更を取得できる速度が制御されるため、ペナルティがあります。

フックについての注意

Git には、リポジトリがフェッチされたときに起動するフックはありません。に応答してプルするこの種のことを行いたい場合は、実際の を呼び出す前に 2 つのリポジトリを同期するラッパー スクリプトにgit fetchを置き換えることができる場合があります。git upload-packgit upload-pack

于 2012-11-06T01:24:53.887 に答える
0

私は非常によく似た状況にあります-そして私の計画されたアプローチは、リモートからのプルを行う事前受信フックを実行するようにローカルリポジトリを構成しようとすることです(ローカルマージの競合を自動受け入れます)、および受信後リモートリポジトリにプッシュするフック。さらに、5 分ごとにリモートからローカルにプルする cron ジョブを設定し、ローカル マージも自動承認する予定です (リモートからローカルへのプッシュができないため)。

このように、リモート ユーザーはリポジトリからプッシュ/プルを実行しますが、ローカル リポジトリは「マスター」として機能し、ローカル ユーザーはローカル リポジトリで作業します。自動競合の解決には潜在的な問題がたくさんあると思います。私たちの CI は、コミットがあると 15 分ごとにビルドを実行するように設定されているため、問題はかなり迅速に発見されます。さて、これをどのように配線するか...明日から始めます...

于 2013-06-19T14:37:18.737 に答える