git を使用したいくつかの顧客プロジェクトで小さなランダムな更新を行う Web プロジェクトをバージョン管理するためのより良い提案はありますか?
Web プロジェクトのバージョン管理に git を使用したいと考えています。他のほぼすべての提案との主な違いは、これが HTML、JavaScript、およびいくつかの PHP ファイルを使用する Web プロジェクトであることです。典型的な Linux パッケージのように、1 つまたは複数のプログラムで使用される中央ライブラリはありません。
私のさまざまな Web プロジェクトはすべて、同じプラットフォーム ファイルに基づいてさまざまな顧客向けに作成されています。ファイルの 80% は同一であり (プラットフォームと呼びます)、20% はさまざまな顧客のニーズに合わせて変更されていると推定されます。ここでの問題は、顧客の更新が必要なファイルがわからないことです。詳細には、すべての顧客が異なります。
プラットフォーム固有のファイルを 1 つのディレクトリに保持し、これらのファイルを別のディレクトリにある顧客固有のファイルと重ね合わせるのが最適です。これをgitで解決するには、これまでのところ本当に良いものは何も見つかりませんでした:
- git サブモジュール(ここで提案されているようなもの) は、通常、ベンダーが開発したライブラリのソースを、それをリンクするプログラムの近くに配置するように設計されています。したがって、問題は、プラットフォーム ファイルと顧客ファイルが異なるディレクトリにあることです。そのため、展開中にこれらを混在させて、Web サーバー用のファイルを作成する必要があります。さらに、ディレクトリ ツリーの同期を手動で維持する必要があり、10 のディレクトリ階層を使用すると、非常に多くの作業が必要になります。一般に、サブモジュールを使用した大きな管理作業について多くの投稿が不平を言っていますが、それはやり過ぎのようです。
- git サブツリー(ここで提案されているように) はサブモジュールよりも単純に見えますが、異なるディレクトリで同じ問題を抱えているため、ディレクトリ構造を同期させ、展開中にファイルを混在させる必要もあります。さらに、顧客リポジトリからプラットフォームの変更をプッシュバックすることは困難です。
- GitSlave (ここで提案されているように) これが私にとって有益かどうかはわかりません。複数の git リポジトリの同期を維持できます。プラットフォームのディレクトリ構造の同期に役立つかもしれませんが、信じられません
- 異なるディレクトリにあるプラットフォーム ファイルと顧客ファイルの間のリファクタリング(このディスカッションの結果のように) 私の顧客と Web プロジェクトで使用されるテクノロジの場合、これはまったく不可能だと思います。ある顧客の場合はこのページを更新する必要があり、別の顧客の場合はそのページを更新する必要があります。PHP フレームワークを導入する場合でも、顧客固有の変更はツリー全体に広がります。
- チェックアウト(前回の投稿でのこの議論でも提案されているように) これは非常に単純で有望に見えますが、すべての顧客固有のファイルが git の外部にある (つまりバージョン管理の外部にある) という欠点があります。さらに、ファイルがプラットフォームと顧客で更新された場合、git pull は失敗します - 中止されるため、これは使用できません
- 私が学んだように、ベンダー ブランチ(ここで再開されたものなど)、ブランチは元に戻されるように作成されており、それは私の顧客固有のパッチを対象としたものではありません。これらのブランチは常に開いており、プラットフォーム (メイン) から顧客への更新後にのみマージされます。そして、これは、すべての顧客とプラットフォーム情報を保持するメガライト リポジトリにつながります。これは、リポジトリを処理する git の方法ではありません。
- 展開中に混合します。したがって、プラットフォーム ファイルを 1 つのリポジトリに保持し、顧客ファイルも専用のリポジトリに保持する非常に実用的な方法です。Web サーバーへのファイルの展開中に、最初にすべてのプラットフォーム ファイルを書き込み、次にそれらの一部をプラットフォーム固有のファイルで上書きできます。混合は、Web サーバー ディレクトリで非常に遅く発生します。これには、各顧客のディレクトリ構造をプラットフォーム構造と手動で同期する必要があるという欠点もあります。そうしないと、展開が複雑になりすぎます。
ここで最善のアプローチは何ですか?