跟踪源代码变体

2024-01-23

我很快就开始维护一系列包含相同嵌入式软件变体的产品。由于我已经使用 git 一年了并且非常欣赏它,所以我很可能使用它来进行源代码控制。

我可以看到多种用于维护固件变体的选项,但没有一个让我太满意。您在自己的工作中应用了哪些最佳实践?

我能想到的替代方案:

  • defines。预处理。 优点:所有内容都始终存在于源代码中,很难错过其中一款产品的更新。 缺点:较难阅读。当我们只有两个变体时可能还好,当它变成四个或更多时,那就很痛苦了。而且,应用 DRY 原则(不要重复自己)似乎更困难。

  • 每个产品变体一个分支。 当包含适用于所有产品的更改时,必须将更改合并到其他产品。 缺点:如果提交包含所有产品的更改和特定变体的更改,则会出现问题。当然,您可以确保提交仅包含一种更改:此产品更改或整个系列更改。但尝试将其强加给团队?另外,合并是行不通的,我们应该精挑细选。正确的?

  • a 核心存储库作为子模块。 将包含核心功能的所有文件单独作为存储库。 所有产品都包含核心存储库的一个版本作为子模块。 缺点:我看不出最终不会有核心子模块的变体。然后我们又遇到麻烦了,然后我们又会使用定义或一些不好的东西。 有分支的核心存储库?然后我们回到之前的选择:必须合并适用于所有分支的更改,但合并还包括产品特定的内容。

  • create 每个模块一个存储库。 例如,显示驱动程序的存储库、电源管理硬件的另一个存储库、用户输入接口的另一个存储库…… 优点:良好的模块化。只需选择您需要的模块作为子模块即可制作新产品!所有子模块都可能有分支,例如一个变体以不同的方式使用硬件。 缺点:有很多很多模块,每个模块都跟踪几个文件(一个包含文件和一个源文件)。一个麻烦。 有人在某些模块中进行了重要更新?然后,如果合适的话,需要有人将更改包含在该模块的其他分支中。然后有人还必须更新每个产品存储库中的子模块。 做了相当多的工作,但我们有点失去了 git 的快照功能。

你是如何做到的,效果如何?或者你会怎么做?

我有一种感觉,我应该体验一下樱桃采摘。


您应该尽可能努力将每个变体的自定义代码保留在其自己的文件集中。然后,您的构建系统(Makefile 或其他文件)根据您正在构建的变体选择要使用的源。

这样做的优点是,在处理特定变体时,您可以看到它的所有代码,而不会出现其他变体的代码造成混淆。可读性也比在源代码中乱七八糟地使用 #ifdef、#elif、#endif 等要好得多。

当您知道将来想要合并时,分支效果最好all将代码从分支转移到主分支(或其他分支)。它不适用于仅合并some从一个分支到另一个分支的更改(尽管这当然可以完成)。因此,为每个变体保留单独的分支可能不会产生好的结果。

如果您使用上述方法,则无需尝试在版本控制中使用此类技巧来支持代码的组织。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跟踪源代码变体 的相关文章

  • 使用终端时 Git 推送在总计后卡住了?

    我尝试将一些文件推送到Github 总大小只有22 2M 我不知道为什么它在总行之后卡住了 我读过推送到 Github 时 Git 推送挂起 https stackoverflow com questions 16906161 git pu
  • 如何将工作树与提交进行比较?

    我在用着 git diff mycommit 用于比较我的工作树mycommit 但它似乎忽略当前索引中不存在的文件 您可以按如下方式重现它 git init echo A gt A txt git add git commit m A g
  • git 日志历史记录图,每次提交一行,彩色,带有日期

    我需要的格式如下 git log decorate graph oneline date order 但我也需要它 包含日期 短 具有相同的颜色 I tried git log decorate graph oneline date ord
  • Git 提交失败:“请使用 -m 或 -F 选项提供消息。”

    当我键入 git commit 命令来提交文件时 我收到以下错误消息 Microsoft Visual Studio 微软 找不到命令 错误 核心编辑器 Microsoft Visual Studio 存在问题 请使用 m 或 F 选项提供
  • 如何使用 Git 跟踪目录而不是文件?

    我最近开始使用 Git 但只有一件事遇到了麻烦 如何在不跟踪目录内容的情况下跟踪目录 例如 我正在开发的网站允许上传 我想跟踪上传目录 以便在分支等时创建它 但显然不是其中的文件 在开发分支中的测试文件或主控中的真实文件 在我的 gitig
  • Git 2.2.x 无缘无故更新旧包文件的时间戳

    Git 2 2 0 和 2 2 1 似乎修改了旧的时间戳 git objects pack pack pack偶尔会无缘无故地文件 它只是改变时间戳 内容是相同的 调试这一点很困难 因为它似乎很少进行更改 我在 2 2 0 之前的任何 Gi
  • 为所有子文件夹设置 git 配置值

    我知道可以设置每个存储库的配置来覆盖用户级配置 即 path to my repo gitconfig覆盖 gitconfig 是否可以设置 git 配置来覆盖给定文件夹的所有子文件夹的用户级设置 即 我有 topLevelFolder1
  • 无法通过 Git Bash 克隆 git 存储库

    在尝试使用克隆存储库时git clone 它显示以下错误 致命 无法访问 https github com microsoft c9 python getting started git https github com microsoft
  • Git:从 master 以外的分支克隆

    我正在尝试从 Github 的存储库中提取数据 但我不想克隆主分支 我想克隆其他一些分支 当我尝试时git clone
  • 如何减少 Bitbucket 上的 git repo 大小?

    我的问题摘要 在我向两个现有文件添加了几百个字节后 我在 Bitbucket 上的一个私人存储库的大小突然增加了一倍多 该存储库现在超过 2GB 这导致 Bitbucket 将其置于只读模式 因为它处于只读模式 所以我无法推送会减少存储库大
  • 将更改从一个分支复制到另一个分支

    我有一个分支名为BranchA from master 我有一些改变BranchA 我不会合并来自BranchA to master 现在我创建了另一个分支master named BranchB 我如何复制更改BranchA to Bra
  • git 2.32 git push -u origin master 没有任何反应

    I ve starting to use git github and I m stucked on how to push my codes to github I m following some tutorials and when
  • 有没有一个简单的命令可以将分支转换为标签?

    我即将完成将 哑快照 转换为 git 的繁琐过程 这个过程进展得非常顺利 感谢这个重命名过程 https stackoverflow com questions 6628539 how to tell git that its the sa
  • Gerrit 和 Active Directory

    我正在尝试设置 Gerrit 以使用我们的公司 Active Directory 进行身份验证 我知道很多人都设法让它发挥作用 但它对我来说不起作用 如果我运行一个ldapsearch命令如下我得到了正确的结果 所以我知道我的搜索字符串是正
  • MSysGit 与 Windows 版 Git

    我无法确定MSysGit 和 Windows 版 Git 之间的区别 http msysgit github com 它们有何不同 为什么我会选择其中之一而不是另一个 它们不是同一个东西吗 On http msysgit github co
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 如何创建名称中带有正斜杠的标签

    当我已经有了类似的标签时 有什么方法可以创建名称中带有正斜杠的 git 标签吗 假设我有 1 16 0 标签 并且我想创建 1 16 0 1 0 0 标签 git tag 1 16 0 1 0 0 error refs tags 1 16
  • Git:如何正确合并两个功能完全不同的分支?

    想象一下这样一种情况 同一个项目有两个分支 第一个分支的一部分对另一个分支进行了大幅重构 但有一段时间 您需要保持两个分支的功能 因此您需要对两个分支进行错误修复和关键功能添加 有时是以不对称的方式 在某些时候 您必须将重构的分支合并到原始
  • 使用BFG时可以指定多个文件吗?

    我正在尝试删除通配符无法覆盖的多种类型的文件 我尝试使用多个 delete files 但它不接受它 还尝试将文件全部放在 delete files 之后 但它也不接受它 有没有一种方法可以将它们全部放在一个命令中 如果没有 那么我必须运行
  • git-lfs 中的多个文件版本

    我正在尝试估计 GitHub 上我的项目的存储要求 并对 git lfs 如何存储多个版本的文件有一些疑问 git lfs 是否存储多个版本的文件 如果是这样 对文件的每次更改都会导致复制整个文件 还是仅存储差异 所有版本都会计入 gith

随机推荐

  • Visual C++ 中的堆框架有多大

    在 Visual C 中 如果我使用 new 在堆上创建对象 堆帧头和填充会占用多少额外空间 特别是在发布代码中 我期望一个 int 表示块中有多少可用空间 另一个可能表示当前正在使用多少空间 并且帧大小根据体系结构四舍五入到最接近的 32
  • WEB API 返回遵循序列化属性的对象

    我正在使用 WEB API 返回一个对象 类 类已经使用 System Xml Serialization 属性进行结构化 这使得使用 WEB API 返回整个类变得困难 因为它公开的内容超出了应有的范围 我不认为这是序列化类并返回字符串的
  • MDX 查询返回记录数

    以下是我的 MDX 查询 SELECT NON EMPTY Measures Fact Sample Count ON COLUMNS NON EMPTY Fact Sample Sample Reference No Sample Ref
  • Django 的缓存模块可以在 Google App Engine 上运行吗?

    我正在 Google App Engine 上运行 Django 1 0 2 并且想知道以下哪一项 如果有 Django 缓存模块 http docs djangoproject com en dev topics cache 本质上应该与
  • GCC 生成的 ARM 和 x86 汇编代码的差异

    让我们看一个简单的 C 代码来设置寄存器 int main int a int 111111 a 0x1000 return 0 当我使用 1 级优化为 ARM arm none eabi gcc 编译此代码时 汇编代码类似于 mov r2
  • travis 构建失败,因为缺少 devtools

    我正在尝试设置 travis 构建 但失败并出现以下错误 export PKG TARBALL Rscript e pkg lt devtools as package cat paste0 pkg package pkg version
  • Django JavaScript 文件

    在 Django 应用程序中 我应该将 javascript jquery 脚本放在哪里 与其他静态媒体一起使用 请参阅此处了解更多信息 http docs djangoproject com en dev howto static fil
  • 使用 Margin Auto 和 Center 将 Float Left Div 居中

    我知道这个问题已经被问过很多次了 将 div 居中对齐 https stackoverflow com questions 1740587 float a div to center 不过 我遵循他们的建议
  • XNA 的 CPU 使用率高

    我今天刚刚注意到 当我编译并运行一款新的 XNA 4 0 游戏时 其中一个 CPU 线程以 100 的速度运行 并且帧速率下降到 54 FPS 奇怪的是 有时它可以在 60 FPS 下运行 但随后就会下降到 54 FPS 我以前没有注意到这
  • 在 OPTIONS 响应后使 fetch API 与 CORS 一起使用

    我正在尝试从我们的 API 获取数据 API 已启用 CORS 支持并对 OPTIONS 请求返回以下响应 Access Control Request Headers content type Access Control Allow O
  • requireJS 中的上下文和嵌套模块

    我在 requireJS 中的上下文方面遇到了一些麻烦 我想要的是在配置阶段 在加载任何模块之前 创建一个上下文 mycontext 然后始终保留该上下文 这很复杂 因为不幸的是 我需要 base js contextReq require
  • 如何按组应用函数?

    我来自另一个topic https stackoverflow com questions 63529481 group by function with pandas dataset cronbachs alpha with groupe
  • Spock:模拟类的方法未匹配

    我能够通过我的代码的简化版本的测试 感谢 cgrim Spock 方法未被识别为调用 https stackoverflow com questions 53254616 spock method not recognized as an
  • D3JS SVG 视图框属性

    我将 svg 附加到我的 div 并应用 viewBox 属性 0 0 100 100 我的控制台显示 d3 js 的错误 Error Invalid value for
  • 不引人注目的验证 C# MVC Razor

    是否可以进行不显眼的验证 使某个字段成为必填字段 但前提是其他属性发生更改 例如 Required public Decimal Income get set Required public Decimal Tax get set Requ
  • 错误:无法解析 setupPlatform 的所有参数:(?, [object Object], [object Object])

    我将 Angular 更新到版本 8 但遇到了一个小问题 当我使用离子服务启动应用程序时 Error Can t resolve all parameters for setupPlatform object Object object O
  • 在Python中模拟assert_used_with

    我无法理解为什么以下代码未通过 test py import mock import unittest from foo import Foo class TestFoo unittest TestCase mock patch foo B
  • 在 Angular 单元测试中模拟 ngResource

    我有一个ngResourceMockFactory看起来像这样 function use strict angular module app factory NgResourceMock ngResourceMockFactory ngRe
  • Jupyter Lab 显示小部件的问题(javascript 错误)

    我在新 PC 上复制 Jupyter Lab 安装时遇到问题 它在我的前一个上工作得很好 我无法显示简单的小部件 例如 ipywidgets 或 ipyvuetify 中的复选框 我检查了 jupyter widgets 是否已通过 jup
  • 跟踪源代码变体

    我很快就开始维护一系列包含相同嵌入式软件变体的产品 由于我已经使用 git 一年了并且非常欣赏它 所以我很可能使用它来进行源代码控制 我可以看到多种用于维护固件变体的选项 但没有一个让我太满意 您在自己的工作中应用了哪些最佳实践 我能想到的