使用GitHub为不同的硬件设置维护不同版本的代码库的最佳方式



我是GitHub的新手,我所在团队的一个软件项目正在开发具有自定义硬件设置的接口。对于每个硬件设置,都有必要有一个不同版本的代码库,但我有点不确定用GitHub实现这一点的最佳方法。我可以为每个不同的设置创建一个分支,但这意味着它们最终会合并回master。其他人以前遇到过这种情况吗,或者知道处理这种情况的最佳方法吗?

我不认为这与Git/GitHub特别相关,因为它不应该与特定的版本控制系统绑定。我更倾向于从项目设置的角度来看待这一点。

如果我正确理解你的问题,那么你正在构建一个具有一些核心功能的系统,这些功能应该在不同类型的平台上运行。每个目标平台都将运行不同的二进制文件。该二进制文件将包含在该目标平台上运行所需的核心功能和特性。

通常,人们倾向于使用分支来创建新功能或修复错误。在多平台环境中,这些错误修复和新功能应该在所有目标平台上进行测试和部署。

这样一个项目的一个很好的例子是libgit2,它是Git核心方法的100%跨平台纯C实现。

此库在Windows、Linux、MacOSX、Amiga等平台上运行。。。这些平台中的每一个都有特定的要求(不同的64位数据模型,与文件系统、网络交互的不同API…)

对于每个平台需要特定代码的每个领域,项目定义了一些核心功能交互的接口。然后在不同的源文件中为每个平台实现这些接口。在构建时,根据选定的目标平台,将特定的源文件与核心文件一起打包。

为了实现这一点,该项目依赖于CMake,它能够构建一个VisualStudio项目(针对Windows时)或gcc(或clang)项目(针对*nix)。CMake的工作方式是应用CMakeList.txt文件中描述的项目"配方",该文件描述了要包含的文件、要定义的编译器宏。。。

除此之外,为了确保一切正常,该项目连接到一个持续集成服务器上,该服务器构建二进制文件并在每个不同的目标配置上运行测试。在GitHub上工作时,Travis CI(开源项目免费)是一个不错的选择(TeamCity也集成得很好)。将其配置为在所有(或一个子集)分支上自动构建和运行测试非常容易。此外,每个Pull请求都会自动测试!

FWIW,这个优点并不局限于C。例如,LibGit2Sharp,libgit2的Mono/.Net绑定使用了类似的概念,并利用Travis和TeamCity来确保所有测试都通过调试和发布版本中的.Net/Win32、.Net/Win64和Mono/Linux。

总结:

  • 不要将分支用于平台特定
  • 将分支用于新功能和错误修复
  • 用单元测试覆盖你的代码(确保这些测试也能使用特定于平台的代码)
  • 使用CI服务器确保所有目标平台上的所有构建/运行都正常

获得进一步灵感的一些资源:

  • libgit2存储库
  • 制作构建配方
  • Travis CI配置文件
  • 带有特定平台代码的拉取请求示例以及匹配的Travis构建日志

我不知道处理这一问题的"最佳"方法,但我可能会有一个分支,例如core,在那里完成所有非平台特定的工作,然后为每个平台提供额外的分支。平台分支必须定期将core合并到中以获得新功能,但它们永远不会合并到任何内容中。您也可以使用整个存储库而不是分支来实现这一点——一个完全通用的核心存储库,以及每个平台的特定独立存储库,这些存储库从核心存储库中提取,但从不推回。

最新更新