在多个项目中使用 git 标签管理不同的软件版本

Managing different software versions with git tags across multiple projects

我最近 运行 遇到了一个我无法完全解决的问题。我们公司在许多其他项目中开发了一组以一个为中心的项目——我们称之为引擎。该引擎包含使用 MVC 框架 yii 的大部分代码库。还有多个其他项目以该引擎为基础。虽然它们也可以包含独特的代码,但它们主要使用或扩展引擎中的方法和 类,专门为客户的规范量身定制(在合理范围内)。这些项目虽然相似,但可以包含独特的部分,使它们彼此不同。我会说每个项目都有 30-40% 的代码库是他们独有的。

在过去的几个月里,我们 运行 在发布和更新方面遇到了一些困难。每当客户要求新功能时,我们都必须以不干扰其他项目的方式进行开发。大多数时候这不是问题,但有时会导致意外错误或延长开发时间。

不过,最头疼的还是发布之前。虽然我们可以及时推出它们,但测试新代码对所有项目的影响可能会花费比我们想要的更多的时间(我们正在编写单元和 selenium 测试以使过程更快,也因为如果我们想管理这么大的代码库并保持理智,这是合理的做法……不幸的是,我们严重落后了,因为管理层认为我们以后总是可以做的……)。

我们使用 git 作为我们的版本跟踪系统,它应该能够处理这样的事情,至少我希望如此。我们的首席程序员管理着许多结构相似的项目:多个站点 运行 关闭一个中央引擎(这两个引擎是为两个完全不同的目的而设计的)。几年前,他 运行 进入了同样的问题,并开始使用 git 标签来管理更重要的版本。一些客户的站点使用引擎的 1.3 版本,其他站点使用 1.4 等等。虽然这个系统使推送更新和错误修复变得更容易和更快,但我认为它在长期 运行 中并不实用。或者这是最佳实践。

好像"my"引擎应该使用相同的系统,这样我们可以享受更快的开发周期,但我想知道是否有更好的方法。

我的主要问题是:我们可以跟上这种方法多久?虽然我理解只将新代码推送到需要它的项目的优势,但为每个主要功能创建一个新版本似乎很快就会失控。

此外,我们应该如何处理现有代码的修复和更新?我的理解是修复 1.2 上的某些内容并不能修复 1.3 和 1.4 上的错误——或者我错了?或者我应该在 1.4 上修复它?有没有一种方法可以让我轻松地将特定更改应用到 older/newer 版本,这样我就不必多次进行相同的更改?在旧版本上启用为 1.5 编写的函数怎么样?

我开始考虑使用补丁来为每个需要它们的版本提供修复,但我不确定这是个好主意。

或者我应该只说 "f*ck it" 并仅在最新版本上修复错误,一个一个地升级项目,以便在我们可以确保它们不会破坏该特定系统上的任何内容时它们会收到修复程序?

我迷路了。虽然我找到了关于 git 标签和补丁的资源,但我觉得我还没有找到真正解决我的问题的方法。一个有用的,不会破坏任何东西(我 99% 确定我们必须保持一个中央引擎支持多个项目的当前设置),并且是可持续的。目前我们只谈论围绕该引擎构建的少数站点,但今年已经有更多站点的计划,并且随着开发时间的缩短,这个数字只会增加。

我希望你们中遇到并解决了这个问题的一些人可以帮助我 - 我将非常感激(知道有解决方案而感到欣慰......)。

提前感谢您的帮助 - 当我说您会帮助我保持理智时,我不是在开玩笑。

Also, how should we handle fixes and updates on existing code? My understanding is that fixing something on 1.2 doesn't fixes the bug on 1.3 and 1.4 - or am I mistaken? Or should I fix it on 1.4? Is there a way which I can chose that make it easy to apply specific changes to older/newer versions, so I don't have to make the same changes multiple times?

不,对一个版本的修复不会自动应用到所有其他版本。我假设您基于标记为版本 1.2 的提交创建了一个 bug-fix 分支。找到并修复错误后,您应该将修复合并到 1.2 版中,并最终为 1.2.1 标记一个版本。在这个过程中的某个时刻,这些提交应该合并到其他版本(例如 1.3、1.4 等)中,必要时解决冲突。然后发布 1.3.1、1.4.1 等版本,并修复特定于这些版本的任何其他错误。

为了解决更普遍的问题,我认为将您的 "engine" 视为具有自己的发布周期的独立项目是一个合理的策略。每个使用此引擎的项目都可以指定它在项目依赖管理系统中使用的版本(requirements.txt 代表 python,Maven 或 Ant 代表 Java,yarn 或 npm 代表 Java脚本).