23

我正在尝试确定 Git 存储库之间共享代码的最佳实践。

到目前为止,我显然已经遇到了看起来像它们 - 几乎 - 符合要求的子模块。我的项目是一个结构简单的 PHP MVC 框架:

  • /应用程序
  • 核心.php
  • /核

哪里app是包含应用程序特定控制器、模型、视图等的文件夹,而core包含一般用途的文件夹,例如登录控制器。core.php文件本身是所有请求的全局处理程序。

因此,我在这个 MVC 框架的所有部署中的共享代码是core.phpcore.

我可以看到如何core变成 Git 子模块,但不是core.php.

这甚至可能吗?我是否需要重新构建我的框架以便core.php驻留在core文件夹中,以便我可以将整个文件夹作为子模块,还是有更好的方法?

4

3 回答 3

9

如果您可以使用符号链接(例如,您没有使用 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
于 2010-11-14T07:16:09.167 回答
6

也许你最好在一个单独的 repo 中维护 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 -子树合并

它比本书上一节(6.6)中建议的设置对你来说要好一点。

看它; 这可能会有所帮助。

于 2010-11-13T04:25:15.793 回答
5

子模块是一个 git 存储库,具有自己的 .git 目录,因此它必须包含在一个目录中。我不相信有任何方法可以轻松解决这个问题。您将不得不以某种方式将您的东西打包到一个目录中 - 如果 core.php 与核心中的东西一起使用,那么将它们放在一个子模块存储库中是完全有意义的!

rmk 的回答,建议你在一个 repo 中完成这一切,使用 core 和 core.php 作为起点是另一个合理的选择。您应该根据预期的工作流程做出决定。如果您计划将 core* 内容与使用它的项目分开修改,则子模块会很好;然后,您可以更新使用它的各种项目中的子模块。如果您想修改核心* 内容以适应特定项目,基线存储库会很好;然后,您可以从基线 repo 中获取更新,将它们与您在项目 repo 中所做的更改合并。

于 2010-11-13T04:18:04.817 回答