我正在尝试确定Git存储库中共享代码的最佳实践。
到目前为止,我显然遇到过子模块,看起来像是 - 几乎 - 符合要求。我的项目是一个PHP MVC框架,结构简单:
其中app
是包含特定于应用程序的控制器,模型,视图等的文件夹,而core
包含一般用途的文件夹,例如登录控制器。 core.php
文件本身是所有请求的全局处理程序。
因此,我在此MVC框架的所有部署中的共享代码是core.php
和core
。
我可以看到如何将core
转换为Git子模块,而不是core.php
。
这甚至可能吗?我是否需要重新构建我的框架,以便core.php
位于core
文件夹中,这样我就可以将整个文件夹作为子模块,还是有更好的方法?
答案 0 :(得分:8)
如果您可以使用符号链接(例如,您没有使用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/
在每个app存储库中,base/
目录是使用“base”存储库的子模块或“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
答案 1 :(得分:4)
子模块是一个git存储库,具有自己的.git目录,因此它必须包含在目录中。我不相信有任何方法可以轻松解决这个问题。你将不得不以某种方式将你的东西打包到一个目录中 - 如果core.php与核心中的东西一起使用,那么它们在子模块仓库中就可以完全合理了!
rmk's answer,建议你在一个仓库中完成所有这一切,使用core和core.php作为起点是另一个合理的。您应该根据预期的工作流程做出决定。如果您计划将核心*内容与使用它的项目分开修改,那么子模块将会很好;然后,您可以更新使用它的各个项目中的子模块。如果要修改核心*内容以适应特定项目,基线存储库将会很好;然后,您可以从基线仓库中获取更新,将它们与您在项目仓库中所做的更改合并。
答案 2 :(得分:4)
也许你最好将core.php和core保存在一个单独的仓库中,然后将其用作远程仓库。 然后,您可以通过将其拉入任何使用的项目来管理它。为了做到这一点,只需将新项目作为单独的git仓库启动,然后将“核心”仓库作为子树拉入。
本章介绍如何操作:
更新参考:http://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_subtree_merge 原始参考:https://git-scm.com/book/en/v1/Git-Tools-Subtree-Merging
对于你来说,这比本书上一节(6.6)中建议的设置要好一些。
看看它;它可能会有所帮助。