1

私はこの状況を持っています:

リポジトリ Aには、ある種のフレームワークが含まれています(たとえば、基本的なセットアップといくつかの一般的なコントローラーを備えた CakePHP)。

リポジトリ Bには、リポジトリ A に基づくプロジェクトが含まれており、追加のファイルと、フレームワークからのファイルの変更/追加が含まれています。

残念ながら、A が B プロジェクトの別のサブフォルダーになるように構造を変更することはできません (コントローラー フォルダーには、フレームワークからの共通のコントローラーと追加のコントローラーがあります)。

私は次のことを達成したい:

フレームワークにいくつかの変更をプッシュした後(A)、それらの変更を別のリポジトリに適用したい(B)。A と B は、サーバー上で共有ベア リポジトリとしてセットアップされます。

私が理解しているように、post-receive(またはpost-commit?)フックはそれを処理できますが、それがどのように行われるかわかりません。フックは最後の変更からパッチ ファイルを作成し、何らかの形でこれを他のいくつかのリポジトリに適用する必要があると思います。

誰かがその例を持っていますか?

(別のアプローチは、そのフレームワークに基づいてすべてのプロジェクトに 1 つのリポジトリを使用し、各プロジェクトをブランチにすることでしたが、これはあまりきれいに見えず、すべてのプロジェクトを 1 つの大きな塊にするという考えは好きではありませんでした) .

4

1 に答える 1

0

(あるサーバー上の)--bareリポジトリから(and , , ... )にパッチを送信したい場合、主な問題はこれを理解することです:持ってる?"ABCDEABCD

たとえば、作業中の誰かが次のことをA行ったとします。

git push origin master:experiment_for_joe devel:featureX

彼がローカルmasterブランチに持っていたものをジョーに渡し(おそらく彼自身のレポで何らかの方法で移動する前に)、彼のdevelブランチに持っていたものをサーバーで名前をfeatureX付けます。

いくつかのバージョンの experiment_for_joe および/または featureX は に移行しBますか? または多分だけにD

それに対する答えは、「いいえ、決して、入るものは何でも出るだけです」だとしましょうdeploy。十分に簡単ですが、質問の残りの半分:B誰かが に 3 つのコミットを追加する前に最新かつ最高のコミットがdeployあったのに、何らかの理由でC7 つのコミットが遅れていたとしたらどうでしょうか? バージョン onがrepoのどDのバージョンとも一致しない場合はどうなりますか?A

これらすべての質問を解決できると仮定すると、次のようになります。

devel on A is now the latest
B has $on_B which is definitely in A
C has $on_C which is definitely in A

B(など)、次に — 、Cなどはすべてリポジトリであり、すべての中間コミットを表示する必要があると仮定します (そうでない場合は、代わりに 1 つの大きなパッチを取得できます)。

git format-patch $on_B..devel

B同期に必要な一連のパッチを取得し、次のことを行います。

git format-patch $on_C..devel

C同期に必要な一連のパッチなどを取得します。(ターゲットリポジトリが「実際には一致しない」場合、これらを適切に適用するにはマッサージが必要になる場合があります。)

(それらがリポジトリでない場合はgit diff $on_B devel、 、またはおよび/またはいくつかの基礎となる配管ビットを使用して、「現在のものをgit diff-tree現在のものに変更する方法」の直接マッピングを取得します。ただし、ここで何か問題が発生した場合、2 つが抜け出す可能性があります。同期すると回復が難しくなります. 、 などリポジトリである場合、回復するために何をする必要があるかを理解する可能性が高くなります.)BdevelBC

于 2013-09-25T20:52:30.773 に答える