硬件 (ECAD)、文档和固件项目的版本控制工作流程/架构建议

Version Control Workflow / Architecture recommendations for Hardware(ECAD), Documentation, and Firmware projects

我们应该使用 SVN 还是 GIT?对于以下用例

我们应该如何组织系统:

1:"master repo" 包含项目使用的所有项目和独立驱动程序,每个项目/驱动程序都不同 "branches"?

示例:

MasterRepo
|-Project1
| \---Hardware
|     \--ECAD
| \---Firmware
|     \--src
|     \--includes
| \---Documentation
|-Project2
| \---Hardware
|     \--ECAD
| \---Firmware
|     \--src
|     \--includes
| \---Documentation
|-Drivers
| \---driver1
|     \--src
|     \--includes
| \---driver2
|     \--src
|     \--includes

2:每个项目和独立驱动程序的单独回购?我们需要 "pull" 或 "merge" 从驱动程序仓库到项目仓库。这对于显示在驱动程序层中出现错误的情况下了解哪些项目受到影响的易处理性很重要。

Project1Repo
|---Hardware
|   \--ECAD
|---Firmware
|   \--src
|   \--includes
|---Documentation


Project2Repo
|---Hardware
|   \--ECAD
|---Firmware
|   \--src
|   \--includes
|---Documentation


DriversRepo
|---driver1
|   \--src
|   \--includes
|---driver2
|   \--src
|   \--includes

硬件应该完全在一个单独的 repo 中吗?(我们是嵌入式软件工程师,我们需要查看原理图并知道何时有更改或建议更改等)

每个驱动程序都应该在单独的 repo 中吗?

我们是汽车行业的嵌入式电子公司。在我开始之前,软件团队没有使用任何版本控制系统,一切都是 "versioned" 通过文件夹和 zip。硬件方面仍然使用这种版本控制方式。

我们已经开始使用 SVN(但未绑定)。我们目前正在为以下软件使用临时制作的模型:

MasterSoftwareRepo
|-Documentation
|-MicroControllerMFG1
| \--FamilyOfMCUs
|    \--Drivers
|    \--Projects
|       \--Project1
|          \--active
|             \--src
|             \--test
|             \--build
|          \--release
|             \--srev1
|             \--srev2
|             \--srev3
|          \--projectSupport
|       \--Project2
|          \--active
|          \--release
|          \--projectSupport
|       \--Project3
|-MicroControllerMFG2
| \--FamilyOfMCUs
|    \--Drivers
|    \--Projects
|       \--Project10
|       \--Project11
|       \--Project13
|-MicroControllerMFG3
| \--FamilyOfMCUs

.......................and so on. 

系统工作...它不漂亮,也不是有效的。因为我们只使用了该系统 6 个月,并且发生了超过 40gigs 的总存储库大小。由于结构的原因,我们并没有真正按预期使用版本控制,它有更多的历史文件夹。

还有更多背景知识,我们的团队规模中等,但每个项目的团队都非常小...每个项目 1 个软件,1 个硬件,1 个机械。我们每个人一次可能有1-2个项目。我们部门有 20 多人。

因此,由于人们在同一项目或文件上工作而导致合并冲突的重要想法是不存在的,因为存储库确实只是在这里跟踪我们自己,并保留更改文档等。

对我们的用例有哪些建议?我们认为 1 repo 的想法太大了,但我们坚持使用它的想法,这样我们就可以从驱动程序中拉出来。和基础项目结构等,所以我们从一开始就具有完全的易处理性。

硬件应该是一个单独的仓库吗?我们可以将它作为一个分支包含在我们的回购协议中吗?或者我们将如何做到这一点?

不使用托管解决方案,所有解决方案都需要自行托管。

是的,我知道这很长 post,但我认为我提供的细节越多,您就越能理解情况和我们的用例。

如果您已经使用该存储库 6 个月并且它的大小已经达到 40 GB,那么随着时间的推移它可能会变得太大而无法轻松管理。

对于您遇到的问题,我建议切换到 git - 但使用 git-lfs 来管理您的二进制 (non-ascii) 文件。 git-lfs 允许用户仅在本地拥有最新版本的二进制文件 - 而对于正常 git,每个文件的所有先前版本都存储在本地(以压缩形式)。

这将允许您将文档和 ECAD 保存在同一个存储库中 - 但只能在本地查看文件的 current/latest 版本。

我认为第一个存储库选项将是目前最好的解决方案

MasterRepo
|-Project1
| \---Hardware
|     \--ECAD
| \---Firmware
|     \--src
|     \--includes
| \---Documentation
|-Project2
| \---Hardware
|     \--ECAD
| \---Firmware
|     \--src
|     \--includes
| \---Documentation
|-Drivers
| \---driver1
|     \--src
|     \--includes
| \---driver2
|     \--src
|     \--includes

至于分支的数量——您是否能够根据拉取请求在分支上进行所有测试?或者您是否需要对您的更改进行 1-2 个月的测试才能确定它们是否 stable/good?

如果第一个选项是现实的,我认为单个 'master' 分支会起作用 - 在将 PR 合并到主要主线之前,您可以在其中提交拉取请求并在该分支上进行所有测试。

如果第二个选项更好,您可以使用双分支结构 - 一个 'master' 和一个 'stable' - 你有一个正在测试的主要开发分支 - 和一个最终分支release/stable 将进行更改的分支 - 一旦它们在开发线上得到验证。

如果将来您计划拥有非常多的项目,即使存储每个文件的单个副本也会变得太大,您还可以查看 git 子模块(单独的存储库,但每个项目存储库都会包含指向另一个存储库中某个时间点的指针)。最后一个选项是研究使用 Virtual File System for git - 但此选项会限制您可能正在研究的任何 git GUI 选项。