在这种情况下如何使用Git处理共享代码?

时间:2011-01-26 12:56:33

标签: git version-control git-submodules version-control-migration

我目前正在尝试将版本控制切换到Git(来自CVSNT)。令人惊讶的是,这不是我遇到问题的分期性或临时区域的概念。但是,我很难解决AFAICT操作,如分支,合并和标记总是应用于存储库级别而不是文件或目录级别......

我们在不同的项目中重用了很多代码。我的工作区目前看起来像这样:

/Dev
  /Libs
    /LibA
    /LibB
    /LibC
  /Project1
  /Project2
  /Project3
  /WebDev

现在,假设Project1依赖于LibA和LibB,Project2依赖于LibB和LibC,而Project3没有lib依赖项。其中一些lib后来被编译成DLL(或BPL-我们的主要开发环境是Delphi),其他只是可重用代码的集合,它们被逐个文件地包含在主项目中。

WebDev包含我们(主要是静态的)公司网站的代码,该网站还包含有关Project1,2,3的信息,因此可能需要与它们一起标记。

由于我在项目之间切换很多,我通常会同时检查所有这些内容,并在必要时将lib目录即时更新到相应的项目分支。

我如何在Git中对此进行建模,是否有理由坚持这种工作方式?我已经阅读了关于git子模块的内容,但到目前为止,我还没有看到我将如何应用它,原因如下:

  • 据我所知,子模块总是会在里面中检出各自的“超级项目”。但是,我们发现使用Delphi管理(设计时)库代码的多个副本是皇家PITA,这是我们将所有库保存在单个项目树之外的公共目录下的原因之一。其他副本只能通过构建自动化进行检查,从不进行任何实际工作。

  • 我真的不希望libs与项目“独立”:如果我标记或分支其中一个项目,我总是想要标记或分支各自的libs。当我想回到主项目的特定标记版本时,我希望libs也可以恢复到该状态。如果可能,标记/分支/签出应始终在项目及其依赖项的单个步骤中发生。

我已尝试将所有内容放在一个Git存储库中,其中库代码主要在主分支上进行管理,并且每个“项目”都在自己的分支上,但每当我尝试合并主服务器和项目之间的lib更改时分支它从不相关的库中提取所有文件,这根本不是我想要的......

你们有什么想法如何最好地解决这一切?我对所有建议都持开放态度,包括我工作树的新布局。

如果有人能指出我关于子模块的实际动手教程(或者我需要完成的任何其他技术),那也很棒。

1 个答案:

答案 0 :(得分:3)

  • 首先:每个组件一个Git仓库(一个组件是Lib或项目,见Git Limits
  • 第二个:一个父项目(Dev),您可以根据该项目声明所有子模块。

这样,您可以快速签出dev,然后仅初始化/更新您要处理的子模块(如果需要,可以包括所有子模块)。
标记时,应用于父repo'Dev'的标记将引用所有子模块的精确提交,这意味着:如果您恢复到旧版本,您将获得与之前状态相同的确切子模块。

该组织将是"system approach",您可以在其中更新组件的任何部分。