Git リポジトリ間でコードを共有するためのベストプラクティスを確認しようとしています。
これまでのところ、私は明らかに、ほぼ要件を満たしていると思われるサブモジュールに遭遇しました。私のプロジェクトは、シンプルな構造の PHP MVC フレームワークです。
- /アプリ
- コア
- /芯
はapp
、アプリケーション固有のコントローラー、モデル、ビューなどを含むフォルダーです。一方、core
ログイン コントローラーなどの一般的な用途のものも含まれています。core.php
ファイル自体は、すべてのリクエストのグローバル ハンドラーです。
したがって、この MVC フレームワークのすべてのデプロイメント間で共有されるコードは およびcore.php
ですcore
。
core
Git サブモジュールに変換する方法はわかりますが、できませんcore.php
。
これは本当に可能ですか?フォルダー全体をサブモジュールにできるように、フレームワークを再構築してフォルダーcore.php
内に配置する必要はありますか、それとももっと良い方法がありますか?core
ベストアンサー1
core
シンボリックリンクを使用できる場合 (たとえば、Windows を使用していない) は、次のように設定できますcore.php
。
# "base" repository layout:
core/
core.app
# each app repository layout:
base/
core/
core.php
core -> base/core/
core.php -> base/core.php
app/
各アプリ リポジトリでは、base/
ディレクトリは「ベース」リポジトリを使用するサブモジュールか、「ベース」リポジトリのサブツリー マージのいずれかになります。
どちらの方法でも、特定のアプリのコンテキストでベース コードに変更を加え、後でその変更をメイン ベース リポジトリに戻すことができます。サブモジュールを使用する場合は、新しいベース コミットを参照するアプリ コミットを公開する前に、必ず新しいベース コミットを公開するように注意する必要があります (サブツリー マージを使用する場合は、各アプリが「フラット」であり、事実上独自のベース コピーを持っているため、これは問題になりません)。
第三者git サブツリーサブモジュールを使用しない場合、このコマンドはサブツリーのマージを管理する非常に優れた方法のようです。
サブツリー
git init newapp
cd newapp
ln -s base/core
ln -s base/core.php
git add core core.php
git commit -m'point to base (to be added next)'
# hook up base
git subtree add --prefix=base [email protected]:me/app_base.git master
mkdir app
# edit app/bar.php
# update base
git subtree pull --prefix=base [email protected]:me/app_base.git master
.
|-- .git/
| |-- ...
| `-- ...
|-- app/
| `-- bar.php
|-- base/
| |-- core/
| | `-- foo.php
| `-- core.php
|-- core -> base/core/
`-- core.php -> base/core.php
サブモジュール
git init newapp
cd newapp
ln -s base/core
ln -s base/core.php
git add core core.php
git commit -m'point to base (to be added next)'
# hook up "base"
git submodule add [email protected]:me/app_base.git base
git commit -m'incorporate base'
mkdir app
# edit app/bar.php
# update base
(cd base && git fetch origin && git merge origin/master)
git add base
git commit -m'updated base'
.
|-- .git/
| |-- ...
| `-- ...
|-- .gitmodules
|-- app/
| `-- bar.php
|-- base/
| |-- .git/
| | |-- ...
| | `-- ...
| |-- core/
| | `-- foo.php
| `-- core.php
|-- core -> base/core/
`-- core.php -> base/core.php