单个文件作为Git子模块

Wil*_*oft 14 git git-submodules

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

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

  • /应用
  • core.php中
  • /核心

哪个app文件夹包含特定于应用程序的控制器,模型,视图等,同时core包含一般用途的文件夹,例如登录控制器.该core.php文件本身是所有请求全球处理器.

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

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

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

Chr*_*sen 8

如果您可以使用符号链接(例如,您没有使用Windows),那么您可以设置corecore.php像这样:

# "base" repository layout:
core/
core.app

# each app repository layout:
base/
  core/
  core.php
core -> base/core/
core.php -> base/core.php
app/
Run Code Online (Sandbox Code Playgroud)

在每个应用程序存储库中,该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 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
Run Code Online (Sandbox Code Playgroud)

子模块

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
Run Code Online (Sandbox Code Playgroud)

  • Windows Vista 和更高版本支持 NTFS 上的符号链接。 (3认同)
  • ...还有 Vista 之前的版本。从来不明白为什么这么多人说Windows(或NTFS)不能做到这一点。 (3认同)

Cas*_*bel 7

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

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


rmk*_*rmk 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) 中建议的设置对您来说要好一些。

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