2009-05-19 68 views
2

我正在研究一个新项目,我打算保留在一个git存储库中。我知道我将如何在CVS中这样做,但我对git有点新意,并可以使用一些建议。需要一个新项目的git回购布局建议

该项目是用于两个嵌入式设备的固件,这两个嵌入式设备可相互通话并打包成一对。对于这两种设备,都有代码的生产变体和制造变体。这两个设备项目都有许多用于锻炼各种硬件(闪烁LED等)或硬件相关位代码(驱动程序等)的子/同级项目。大部分代码在所有方面都很常见。

我还有一个要求,能够彼此独立地转换生产和制造固件,以防止通过验证发送另一个返回。

下面是我现有的目录布局。它有机地增长,并且在我知道我会使用git之前基本上已经放弃了。如果有更好的方法去做,我并不反对重组整个事情。

  • ProjectRoot
    • 包括
    • SRC
    • DeviceA
      • 生产
      • 制造
      • 眨眼
      • 按钮
      • ...
    • DeviceB
      • 生产
      • 制造
      • 眨眼
      • 按钮
      • ...

我很想在分支机构上进行生产和制造,但我通常在给定的一天都工作,git只允许一个分支机构一次处于活动状态。然后,我不知道如何处理闪烁,按钮等,因为它们不是真正的制造或生产。建议?

澄清:

  • 代码的制造版本用于在生产线上测试硬件。生产代码在硬件通过测试站之后加载,并发送给客户。两者至少有75%相似,但它们需要独立,因此我可以修复生产代码中的错误,而不必停止生产线。

  • 由于DeviceA和DeviceB是一对,因此两个代码集都使用相同的发行版本号同时进行标记和发布。

+0

经过大量的研究和实验,我决定采用子模块方法。公共代码位于主存储库中作为子模块包含的独立存储库中。主要的回购有生产(主),制造和测试分支机构,我保留3个当地克隆进行开发。感谢filmil的建议。 – 2009-05-27 05:12:52

回答

2

我用git来管理硬件/软件codesigns,所以我可能会给一些有用的建议。作为一个经验法则,如果你的设计中的某些部分可以互相操作,而不管你正在修改哪个版本,那么最好为这些部分创建单独的git存储库。

举一个例子,你希望你的驱动程序坐在你的硬件设计的单独的存储库中。这是因为软件和硬件之间的接口非常明确,并且是一个自然分解的接缝。此外,相同的驱动程序版本将适用于设备的一系列设计阶段。

我不确定你的意思是设计的生产版本。如果你想分离开发和稳定版本,你应该没有分开的分支。

git中的分支和合并就像你可以得到的那样便宜,并且分支之间的切换非常快;所以没有分支罚款。在分支机构之间挑选兼容的变更也相当容易。您通常在软件世界中看到的方法(发布的分支,以及一个HEAD)运行良好。

您应该将演示/测试模块(blinkers等)与它们应该演示/测试的模块放在一起。这是因为演示耦合接口经常易于改变。这样你将不得不保持演示代码与实际设备同步,这将有助于设计长期稳定。作为一个方面说明,在FPGA领域中,通常是在大型设备上进行原型设计,然后在受限设备上进行生产。这样,你的模块最终有两个独立开发的品种。您可能希望将这些变种保存在不同的存储库中,因为它们实际上是不同的实体。在这种情况下,两者之间共享的代码(总是有一些可重用的便携式代码)可以存储在单独的存储库中,并成为一个单独的存储库。特别是如果代码大小合理。

然后,您可以使用git子模块将所有提到的模块绑定在一起。

+0

有没有办法让多个分支同时活动/可见?我服务于多个主人,所以我经常在任务之间弹跳(是的,它听起来很棒)。它看起来像git要求在切换之前检查分支的所有更改。 – 2009-05-19 16:39:00

1

我想你可以使用子模块。 我不是100%确定这是如何工作的,但是你可以为你的通用代码(比如LED和用户界面,或者每个用户界面)创建一个git仓库,并且将这个仓库的副本作为你仓库的子模块对于A,另一个副本作为B回购的子模块。

如果要对通用零件进行更改,请在您当前使用的设备上进行更改。完成后,将更改推送到其他产品的子模块。 如果感觉更舒适,您也可以在其他地方的公共部分进行回购。

总结:将您的可重用代码放在单独的回购站中,以便您可以重复使用它。

我不是子模块之王,但我很快就需要做与你一样的事情。所以我对如何让它工作感兴趣。