我是 GitHub 的新手,我小组的一个软件项目正在开发具有自定义硬件设置的接口。每个硬件设置都需要有不同版本的代码库,但我有点不确定使用 GitHub 执行此操作的最佳方法。我可以为每个不同的设置创建一个分支,但这意味着它们最终将被合并回主控。以前有没有其他人遇到过这个问题,或者知道处理这个问题的最佳方法?
2 回答
我认为这与 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 也很好地集成)。将其配置为在所有(或部分)分支上自动构建和运行测试非常容易。此外,每个拉取请求也会自动测试!
FWIW,这种优点不仅限于 C。例如,LibGit2Sharp,libgit2 的 Mono/.Net 绑定使用类似的概念,并利用 Travis 和 TeamCity 确保所有测试通过 .Net/Win32、.Net/Win64 和Mono/Linux,在 Debug 和 Release 版本中。
总之:
- 不要将分支用于平台特定性。
- 将分支用于新功能和错误修复
- 用单元测试覆盖你的代码(确保这些测试也执行平台特定的代码)
- 使用 CI 服务器确保一切在您的所有目标平台上构建/运行正常
进一步启发的一些资源:
我不知道处理这个问题的“最佳”方法,但我可能会有一个分支,例如core
,所有非特定于平台的工作都在其中完成,然后是每个平台的附加分支。平台分支必须定期合并core
以获得新功能,但它们永远不会合并到任何东西中。您也可以使用整个存储库而不是分支来做到这一点 - 一个完全通用的核心存储库,以及从核心获取但从不推回的每个平台的特定单独存储库。