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

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

我目前正在尝试将我们的版本控制切换到 Git(从 CVSNT)。令人惊讶的是,我遇到问题的不是分布式或集结区的概念。但是我很难理解这样一个事实,即分支、 merge 和标记等 AFAICT 操作总是应用于存储库级别而不是文件或目录级别......

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

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

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

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

因为我经常在项目之间切换,所以我通常会同时检查所有这些,在必要时将 lib 目录即时更新到适当的项目分支。

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

  • 据我所知,子模块总是会在它们各自的“ super 项目”内部 check out 。然而,我们发现使用 Delphi 管理(设计时)库代码的多个副本是一个皇家 PITA,这也是我们将所有库保存在单个项目树之外的公共(public)目录下的原因之一。额外的副本只会由构建自动化 check out ,绝不会用于进行任何实际工作。

  • 我真的不希望库与项目“独立”:如果我标记或分支其中一个项目,我总是想标记或分支相应的库。当我想返回到主项目的特定标记修订时,我希望库也恢复到该状态。如果可能,标记/分支/ checkout 应该始终在项目及其依赖项的单个步骤中发生。

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

你们有什么想法可以最好地解决所有这些问题吗?我对几乎所有建议都持开放态度,包括我的工作树的新布局。

如果有人能给我指点有关子模块(或我需要完成此操作的任何其他技术)的真正动手教程,那也很棒。

最佳答案

  • 第一:每个组件一个 Git 存储库(一个组件是一个库或一个项目,请参阅 Git Limits)
  • 第二:一个父项目 (Dev),您在其下声明所有子模块。

这样,您可以快速检查开发,然后仅初始化/更新您想要处理的子模块(如果需要,包括所有子模块)。
标记时,应用于父存储库“Dev”的标签将引用所有子模块的精确提交,这意味着:如果您恢复到旧版本,您将取回与之前状态相同的子模块。

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

关于git - 在这种情况下如何使用 Git 处理共享代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4804796/

相关文章:

r - HTTPS 凭证 : obfuscate console or pop-up window input

git - 将两个相似的远程 git repos merge 为一个

svn - 使用 svndumpfilter 包含多个文件夹

git - 拆分一个 git 存储库以同时处理两个项目

bash - 使用 Bash 将 .gitmodules 转换为可解析的迭代格式

在 macOS 上使用 git-lfs pull 时出现 Gitkraken 错误

ruby-on-rails - 如何从 Heroku 检索 git 存储库?

visual-studio - 哪些 Visual C++ 文件类型应提交版本控制?

git - 检查一个 git commit,包括当时的子模块

git - 如何强制 git merge 冲突