一个目录中有多个存储库

时间:2011-12-30 18:29:43

标签: git svn

这个问题似乎是半常出现的,但遗憾的是我还没有找到答案,我可以完全适用于我的情况,所以我想我会问自己的问题。这是关于SO的第一个问题,所以要好。 :P

"问题" 我们公司开发了多个PHP应用程序,但其中一个应用程序是" master"各种各样的。我们所有的其他应用程序都安装在这个"主应用程序"中,并且需要主应用程序才能工作。

当然,我们使用版本控制来管理这些应用程序。

虽然我们的插件应用程序中的许多文件都在子目录中,但并非所有文件都在子目录中。这意味着我们不能使用子目录导入(svn externals,git子模块等)。例如,在根文件夹中有几个文件夹(admin,public,kernel等),addon应用程序在一个或多个这些文件夹中有文件 - 它们不是独立自包含在主应用程序的目录结构中

我们目前使用SVN,最近发现自己正在考虑git,因为我们认为可用的一些功能对我们有用。然而,我不清楚使用git的一件事是,是否真的有办法合并" (不是在版本控制意义上)当开发人员处理代码时,这些存储库在本地的单个目录中。我还没有办法用SVN做到这一点。

在理想的世界中,我们会为我们的" master"具有如此结构的应用程序:

  • /
  • - file1的
  • - file2的
  • - /管理
  • ---- file1的
  • ---- file2的
  • - /公共
  • ---- file1的

我们的插件应用程序将具有类似的结构(请记住,我们有多个插件应用程序):

  • /
  • - FILEX
  • - /管理
  • ---- / MyApp的
  • ------ file1的
  • ------ file2的
  • - /公共
  • ---- FILEX

我们已经尝试了以下方法,每种方法都有自己的注意事项:

  1. 单个存储库中的所有应用程序。这不太理想,因为它成为每个应用程序有效管理版本的噩梦(特别是在SVN中)。分支和标记会从不相关和单独的应用程序中获取文件。
  2. 所有应用程序位于单独的存储库中。这也不理想(好吧,从管理/组织的角度来看),因为您无法将两个单独的存储库导出到单个文件夹,因此您始终使用一个存储库的签出和其他存储库的导出。如果您正在处理应用程序X并且主应用程序中有更改,则需要手动执行该主应用程序的新导出,并将文件复制到您正在使用的应用程序X存储库以获取最新的框架代码。 / LI>

    有没有办法使用git或SVN(或任何其他版本控制系统)在单个目录中允许多个存储库而不使用子目录? SVN外部几乎是完美的,但要求外部存储库中的所有文件都在一个单独的子文件夹中,如上所述,这对我们不起作用。我收集git具有相同的功能,但同样不能在一个文件夹中允许多个存储库,这给我们留下了同样的问题。

    相关问题: Multiple repositories in one directory (same level) - is it possible? - 这与我想的非常接近,但我认为没有任何解决方案可以应用于我们的情况。

3 个答案:

答案 0 :(得分:3)

我从未尝试在生产环境中做过类似的事情,但你当然可以这样做:

$ git init
$ mv .git .git1
$ git init
$ mv .git .git2
$ export GIT_DIR=.git1
# do work in first repo
$ export GIT_DIR=.git2
# do work in second repo

答案 1 :(得分:3)

git允许您在顶级git命令中指定work-directory和git-directory:

git status
可以修改

以使用带有

的其他.git文件夹
git --git-dir=some/other/path/to/a/different/.git/folder status

同样,您可以指定其他工作文件夹:

git --work-tree=some/other/path status

您也可以合并2。

如果您必须始终拥有此工作流,则可以覆盖并包装git命令以始终指向特定的.git目录或工作目录。一个例子是“git achievement”拦截git命令,并通过git为你提供更好的奖励,然后调用实际的git命令:https://github.com/icefox/git-achievements

看起来很有趣,需要解决。

我还会考虑为每个应用程序分配一个分支,并在核心应用程序完成的任何工作之上不断地重新设置这些分支。这实际上是我的第一选择。

答案 2 :(得分:2)

Subversion 1.6和1.7允许单个文件的外部。

请参阅http://svnbook.red-bean.com/en/1.7/svn.advanced.externals.html

  

“Subversion 1.6还引入了对外部定义的支持   文件。文件外部配置就像外部一样   目录并在工作副本中显示为版本化文件。

     

例如,假设你有文件/trunk/bikeshed/blue.html   你的存储库,你想要这个文件,因为它出现在修订版中   40,出现在/ trunk / www / as green.html的工作副本中。“