如果您可以使用符号链接(例如,您没有使用 Windows),那么您可以core
这样设置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 subtree命令似乎是管理子树合并的一种非常好的方法。
子树
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 git@git.example.com:me/app_base.git master
mkdir app
# edit app/bar.php
# update base
git subtree pull --prefix=base git@git.example.com: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 git@git.example.com: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