Git子库

Jac*_*yte 5 git dependencies repository

我是一个小型固件团队的成员,我们使用私有Git服务器进行版本控制.我们的代码库通常具有用于平台特定代码的文件夹,由多个平台使用的公共代码以及由我们开发的微处理器的制造商提供的SDK.

目前我们的存储库以公共代码为中心; 每个平台在存储库中都有一个文件夹.这至少有两个严重的后果;

  1. 当我们推动一个平台的更改时,对于共享相同公共代码的所有其他平台,它是可见的.这会使提交历史记录与多个平台的发布混乱,并且在过去导致混淆我们正在审查哪个平台的更改.

  2. 在提交之前,需要对存储库中的所有平台验证对公共代码的更改,从而导致不必要的痛苦.(有人昨天没有这样做,并做了一些更改,导致我们的几个旧平台无法构建.这个特殊的存储库有5个平台)

我正在努力为每个平台建立一个存储库,以便我们可以定期更改公共代码并升级SDK,而不必强制更新和验证我们支持的所有平台.由于我们是一个五人团队,这些问题通常会在关键时刻发布,因此可以为我们节省大量不必要的脑损伤和时间.当然,困难的部分在于实施.

现在我想象的是一个系统,每个平台都有自己的存储库,每个公共代码库都有自己的存储库,我们使用的每个SDK都有自己的存储库.平台存储库将链接或以其他方式引用它们用作"子存储库"的公共代码和SDK.

我已经阅读过有关子模块的信息,但我认为它们会导致更多问题而不是修复; 最近我们不得不调试三年前的固件,这需要将我们的本地代码库重置为问题版本以进行静态分析.据我所知,子模块的本地版本与其所在的存储库分离,这意味着将存储库重置为旧提交将使子模块相对于存储库的其余部分处于"未来"状态.在调试旧代码的上下文中,此行为是100%不可接受的.

这是我要实现的项目的项目符号列表; (按重要性排序)

  1. 打破特定代码远离公共代码,因此对公共代码和/或SDK的更改不会对其他平台产生无法预料的后果.

  2. 为每个平台,每个公共代码库和每个SDK创建新的存储库.

  3. 将远程存储库克隆到本地计算机应该是一个步骤; 在构建平台之前,不应强迫新用户拉出每个子存储库.

    • 此外; 恢复旧代码,包括通用代码,以及用于构建任何特定平台的版本XXX,YYY SDK,必须是可能的.

    • 编辑:我最后一次"恢复"代码我使用硬重置到我正在调试的构建和软重置到比我知道的年龄大一年的构建很好,但只有我的语法中的Git插件荧光笔会显示已知好和已知坏之间的变化.

      顺便提一下,这个特殊的平台是单片的,这个问题不适用于它,但为了论证,我们会说它确实适用.

  4. 修改公共代码不应影响平台,直到平台的维护者引入新的公共代码.(我相信通过添加一个公共代码的标记提交而不是公共代码的主人,可以使用子树)

  5. 只读子存储库是可接受的限制.(即,无法在平台的存储库中修改子存储库,或者无法从平台的存储库中推送对子存储库的更改)

  6. SmartGit/HG支持是可取的,因为除了我们的一个成员之外的所有成员都使用它.

  7. 编写一次性任务脚本是可以接受的,但我不想污染具有Git工作脚本的平台.

我也读过关于子树的内容,但此刻我不确定他们是否会直觉地允许我想要的行为.我的主要问题是:Git是否支持这种功能?如果是,该功能是通过子树还是其他方法实现的,我还不知道?

Von*_*onC 1

我认为它们会造成比解决的问题更多的问题;最近,我们必须调试三年前的固件,这需要将我们的本地代码库重置为问题版本以进行静态分析。据我了解,子模块的本地版本与其所在的存储库分离,这意味着将存储库重置为旧提交将使子模块相对于存储库的其余部分保留在“未来”中。

绝对不。
子模块正是您需要的。

如果您需要将父存储库重置为过去的提交,它还会将名为a 的子模块根文件夹重置gitlink为正确的 SHA1(当时记录的)。这就是gitlink 的用途

Aclone --recursive将在一个命令中克隆父存储库及其子模块。

如果需要,您可以配置子模块以遵循分支的最新提交

您可以再次通过一个命令从父存储库推送所述父存储库及其子模块


归档时间:

查看次数:

973 次

最近记录:

8 年,8 月 前