2

これが以前に尋ねられた場合、そのように明確にラベル付けされていない場合はお詫び申し上げます。

2 つの異なる国に 2 つの開発チームがあり、それぞれが同じプロジェクトに取り組んでいますが、開発者はローカル オフィスの Git リポジトリに対して作業しています。各オフィスは異なるタイムゾーンで運営されており、約 8 時間の間隔がありますが、1 時間ごとに最新の状態に保つようにしています。したがって、OfficeA の開発者は自分のリポジトリにプル/プッシュし、OfficeB は自分のリポジトリにプル/プッシュします。プロジェクトのコード/構造は同じです。

OfficeA は真のマスターであり、CI および UAT への展開が行われる場所です。したがって、次のように設定します。

  • OfficeB には、OfficeA のレポのクローン ミラーとして設定されたレポがあります。

    git clone --mirror git@gitlab:project.git

  • OfficeB が OfficeA からの変更でレポを更新するための 1 時間ごとのタスクがセットアップされます (誰も分岐していません。私たちは皆、マスター ブランチで作業するだけです。

    git フェッチ
    git プッシュ

タイムゾーンが原因で、しばらくの間問題は発生しませんでしたが、コードが失われているため、上記のこの解決策は私たちがすべきことではないようです。多くの場合、OfficeB は午前中にコミットが 1 つまたは 2 つ欠けており、これはからの単純なプッシュによって修正されます。ローカル マシン リポジトリから変更が失われないため、各開発者のマシン。

さらに調べてみたところ、この全体的なアプローチは正しくなく、ミラーがまさにそれであるという点で私たちがすべきことではないようです。それでは、HQ リポジトリをリモートで維持し、各リポジトリがローカル開発者によって使用され、両方の側からの変更がマージされてプッシュされ、両方のサーバーが相互に反映されるようにするための最良のソリューションは何ですか? OfficeB には 2 つのリポジトリが必要だと思います。1 つは開発者が使用するもので、もう 1 つは HQ のミラー化されたクローンです。同期スクリプトは、OfficeB のこれら 2 つのリポジトリ フォルダー間で更新とマージを実行します。

これが進むべき道であるかどうかを確認し、あなたの考えやスクリプト、または役立つ可能性のあるものを提供してください. Git は強力に見えますが、非常に紛らわしく、ドキュメントには git 用語がたくさんあり、組織全体で非常に悪い名前になっています :-(

これは、国際企業で働く人々にとって非常に一般的な設定であると予想していたので、明確で簡潔なヒントや、おそらく私の「ググった」ことを簡単に見つけることができなかったことに驚いています :-)

よろしくお願いします

提案

OfficeA はそのままです... OfficeB は OfficeA のベア ミラー クローンを作成します... ミラー クローンから追加のクローンが作成され、DEV はすべてこのクローンを使用します。元のミラーは純粋に、競合を安全に処理するための仲介者として機能する同期プロセス用であり、いったん注意を払い解決すると、リモート マスターにプッシュされます。

それとも、両方の複製されたリポジトリを作業ディレクトリを持つ標準の複製にする必要がありますか?

4

1 に答える 1

0

これは単純な問題ではありません。

それぞれを同時に更新する 2 つのリポジトリがある場合、それらを同期するときに競合が発生する可能性があります。

衝突は、正しい方法で解決するために人間の相互作用を必要とする場合があります。これを解決する 1 つの方法は、B にプッシュしている間は常に同期することです。A はロックダウンされ、B は A にプッシュされ、A は再びロック解除されます。その逆も同様です。これはおそらくあなたにとって良い解決策ではありません。帯域幅に制限があると思います。そうしないと、すべての開発者が A.

それでは、魔法をかけましょう。時差があります。マスター リポジトリを 1 日 2 回移動しましょう。

B を読み取り専用にして、すべての開発者が A にプッシュできるようにします。B にプルを実行させます。A を読み取り専用にして、すべての開発者が B にプッシュできるようにします。A にプルなどをさせます。

更新は常に早送りされます (履歴を書き換えない場合は、rsync などの別の方法で同期する必要があります)。したがって、マージの問題はありません。

そして、いくつかのスマート DNS (またはおそらく git-hooks) ロジックを使用すると、これを開発者に対して完全に透過的にすることができます。たとえば、B が読み取り専用のときに B からプッシュすると、代わりに自動的に A にプッシュされます。もちろん速度は遅くなりますが、それでも機能します。

于 2013-06-07T10:06:25.453 に答える