【问题标题】:How to handle shared code with Git in this scenario?在这种情况下如何处理与 Git 的共享代码?
【发布时间】:2011-01-26 12:56:32
【问题描述】:

我目前正在尝试将我们的版本控制切换到 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 存储库中,其中库代码主要在 master 分支上管理,“项目”每个都在自己的分支上,但是每当我尝试合并 master 和项目之间的 lib 更改时分支它也从不相关的库中提取所有文件,这根本不是我想要的......

你们知道如何最好地解决这一切吗?我对几乎所有建议持开放态度,包括我的工作树的新布局。

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

【问题讨论】:

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


    【解决方案1】:
    • 首先:每个组件一个 Git 存储库(组件是 Lib 或项目,请参阅 Git Limits
    • 第二个:一个父项目 (Dev),您可以在该项目下声明所有子模块。

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

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

    【讨论】:

    • 有关子模块的更多信息,另请参阅stackoverflow.com/questions/1979167/git-submodule-update/…
    • 谢谢,这听起来很有趣! Push/Pull 是否也是适用于所有组件的单一操作?
    • @Olivier:对于 fetch,如果设置了配置 fetchRecurseSubmodules,那么 fetch/pull 将是递归的。虽然不确定推送:请参阅kerneltrap.com/mailarchive/git/2010/7/27/35353
    • 谢谢,您在子模块上的其他答案的链接已经解释了 Push 和子模块的一些潜在缺陷。这周晚些时候我会玩这个。
    • 我仍然有点担心这句话“但主要思想仍然存在:引用特定组件:* 有自己的生命周期 * 有自己的标签集 * 有自己的开发”,无其中适用于(大部分)我们的 lib 组件...该代码通常永远不会在项目上下文之外被触及,并且它没有自己的标签...
    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多