2017-01-25 6 views
0

私たちはsvnからgitへの移行中です。私たちのリモートオフィスの1つにローカルキャッシュリポジトリを設定してそこのデベロッパー遅いネットワークを介してメインリポジトリから押して引き出す必要はありません。マルチレベルgitワークフローの設定方法

したがって、基本的なプロセスでは、localCacheはメインのリポジトリから定期的にフェッチし、devsはlocalCacheからフェッチします。 DevsはlocalCacheにプッシュし、機能を完了するとlocalCacheからメインにプッシュします。

なLocalCacheは、これは私も同じ枝にメインから変更がある場合なLocalCacheから変更をプッシュしたいとき以外はOKに動作するようです--mirror

として設定されています。私がメインからプッシュする前にフェッチすると、メインからのブランチは開発者からプッシュされたものを上書きします。私がフェッチする前にmainにプッシュすると、localCacheからのブランチがmainを上書きします。どちらの場合でも、gitは--forceを指定していなくても "強制的な更新"メッセージを表示します。

これは私が間違った方法でそれについて行くと思います。私はこれがgitがうまくいくはずのものだと確信していますが、それは私にとってスムーズなワークフローではありません。 gitブックの "分散されたワークフロー"セクションでは、彼らが記述したすべてのワークフローは、開発者が常に「メイン」から抜け出していますが、それはまさに私が避けようとしているものです。

+1

なぜlocalCacheにプッシュする必要があるのですか。また、私はgitが簡単に "上書き"しないと確信しています。セットアップとワークフローをもう少し詳しく説明してもらえますか? – coredump

+1

@coredump - mainに他の変更が加えられた理由は、すべての開発者がlocalCacheを使用しているわけではありません。私が上書きすると、私はブランチポインタが上書きされたことを意味します。ファイルは失われませんが、コミットにはアクセスできなくなります。次のdevは、ブランチポインタが上書きされたrepo(mainまたはlocalCache)のいずれかから引き抜こうとすると、アクセスできない変更をマージする必要があります。問題の本質は、メインにプッシュする時点でlocalCacheでこのマージを行いたいのですが、localCacheはミラークローンでなければならず、これはマージをサポートできません。 – Andy

答えて

0

"三角形のワークフロー"と呼ばれるように思えます。注:これはあなたが求めているものではありませんが、実際にはうまくいきました。それがうまく動作する理由は、プッシュが小さく、頻繁ではなく、クローンやフェッチが頻繁に頻繁に行われるためです。ここで

あなたがGitの2.0以降、およびSSH認証を使用していることを前提とした三角形のワークフローの例です:

$ git clone ssh://localoffice.company.com/repos/project 
$ cd project 
$ git remote add hq ssh://companyhq.company.com/repos/project 
$ git config remote.pushdefault hq 

、私はprojectで働くよう、すべてのgit fetchlocaloffice.company.com/repos/projectからフェッチし、git pushプッシュへcompanyhq.company.com/repos/project。詳細は次のとおりです。


三角ワークフローは、図示さ:

definitive-source 
    /^
    / \ 
    v  \ 
cache ---> work 

キャッシュがローカルのミラーであり、決定的なソースは、キャッシュが更新されたマスターです。ネットワークに多くの負荷をかけることなく(通常は低速リンクを持つVPN)、ローカルキャッシュを「十分に最新の状態」に保つことには些細な頭痛があります。

Gitは、Gitバージョン1.8.3以降のコンフィグレーション変数remote.pushDefaultbranch.branch.pushDefaultを使用して、「すぐに使える」三角ワークフローをサポートしています。これには、仕事をしている各人が行う、または代わって少しずつ設定を行う必要があります。つまり、origin URLがキャッシュミラーを指すようにキャッシュからgit cloneにする必要がありますが、プッシュを別のリモートに別のURL(プッシュするためのデフォルトのリモートまたはブランチごとのURLのいずれかを介して)。

(その後、彼らは、リモートに名前を行う場合には、決定的なソースに名前を付け、リモートの名前付けずにプッシュする、またはしなければなりません。)

(前職では、ずっと前に、前にGitのバージョン1.8にも存在していた-I git://プロトコルを使用してローカルミラーを設定する手がありましたが、すべてのプッシュはssh://を経由しました。これらの設定変数を使用するのではなく、これをすべて行ったカスタムラッパースクリプトがありました。

+0

あなたの考えをお寄せいただきありがとうございます。私が持っていたビジョンは、チームがlocalCacheを使用してストーリーを作って仕事を分かち合った後、コミット履歴を整理してメインに戻すことでした。私はそれをメインにプッシュした後にコミットの履歴を書き換えることは悪い考えだと考えているので、私はそれを避けようとしていました。 – Andy

+0

「履歴を書き換える/しない」は実際には調整の問題です。どのような種類のリライトでも、実際には以前のコミットをコピーしてから放棄します。あなたが置き換えコミットを持つ*ただひとつのリポジトリ(ただ一つのリポジトリを持つ)であれば、誰も混乱して、間違って古い、放棄されたコミットを使用したり再導入することはできません。 *複数の人物やリポジトリ*が関わっている場合は、それらはすべて調整されていなければなりません。彼らが*コーディネートする場合、どのリポジトリがこのように扱われるかは問題ではなく、*そうでなければ、どのリポジトリがこのように扱われるかは重要ではありません。 :-) – torek

+0

これは(私は部屋がなくなった)と言いました。このコーディネーションを実行することは注目に値します。この方法でどのリポジトリや支店名が扱われているかを知ることができます。特定のリポジトリでこれを行うことはできますが、特定のブランチ名や名前パターンでこれを行うことで、長期的にはより良い結果が得られるはずです。たとえば、(私の頭の上から) 'rewdev/foo'という名前のブランチは、rewrite/rewindの影響を受けやすいのに対し、' dev/foo'はforward-development-onlyなので、書き換えを行う場合は、それらを 'rewdev/*'にプッシュします。 – torek

関連する問題