我目前正在尝试将我们的版本控制切换到 Git(来自 CVSNT)。令人惊讶的是,我遇到问题的不是分布性或暂存区的概念。但是我很难理解这样一个事实,即分支、合并和标记等 AFAICT 操作总是在存储库级别而不是文件或目录级别应用......
我们在不同的项目中重用了很多代码。我的工作区域目前如下所示:
/Dev
/Libs
/LibA
/LibB
/LibC
/Project1
/Project2
/Project3
/WebDev
现在,假设 Project1 依赖于 LibA 和 LibB,Project2 依赖于 LibB 和 LibC,而 Project3 没有 lib 依赖项。这些库中的一些后来被编译成 DLL(或 BPL——我们的主要开发环境是 Delphi),其他只是可重用代码的集合,这些代码以逐个文件的方式包含在主要项目中。
WebDev 包含我们(大部分是静态的)公司网站的代码,其中还包含有关 Project1、2、3 的信息,因此可能必须与它们一起标记。
由于我经常在项目之间切换,我通常会同时检查所有这些,并在必要时将 lib 目录即时更新到适当的项目分支。
我将如何在 Git 中对此进行建模,坚持这种工作方式是否有意义?我已经阅读了有关 git 子模块的信息,但到目前为止,由于以下几个原因,我看不到如何在这里应用它:
据我了解,子模块总是会在它们各自的“超级项目”中检出。但是,我们发现使用 Delphi 管理(设计时)库代码的多个副本就像一个皇家 PITA,这就是我们将所有库保存在单个项目树之外的公共目录下的原因之一。其他副本仅由构建自动化检查,从不用于进行任何实际工作。
我真的不希望这些库与项目“独立”:如果我标记或分支其中一个项目,我也总是想标记或分支相应的库。当我想回到主项目的特定标记修订版时,我希望库也恢复到该状态。如果可能,标记/分支/签出应该始终在一个项目及其依赖项的单个步骤中发生。
我已经尝试将所有内容放在一个 Git 存储库中,其中库代码主要在主分支上管理,而“项目”每个都在自己的分支上,但是每当我尝试合并主分支和项目分支之间的 lib 更改时,它都会拉取在来自不相关库的所有文件中,这根本不是我想要的......
你们有任何想法如何最好地解决这一切?我对几乎所有建议持开放态度,包括我的工作树的新布局。
如果有人可以向我指出有关子模块的真正动手教程(或我需要完成此任务的任何其他技术),那也很棒。