Git 上 .NET 应用程序的版本控制策略
Versioning strategy for .NET apps on Git
我的公司刚开始使用 git,我正在为版本控制而苦恼。我们正在使用语义版本控制 (major.minor.patch),我们根据对产品所做的更改进行设置。但是,我想使用第四部分来指示 git 提交。我读过有关如何执行此操作的文章,尤其是使用 post-merge hook 的文章,但我越深入,就越感到困惑,不是在技术部分,而是在概念部分。
我真的很喜欢能够在版本中使用 git 提交哈希的想法,因为它非常清楚软件是什么。但是,直到 提交后我才知道这一点,此时更改版本将需要另一次提交,并且哈希将不正确。因此,如果我得到一个版本号,请转到 git,我实际上会在使用中之前获得提交。我想要的是能够转到 git,获取标签并按照使用中的方式完全构建它。
我怀疑答案在于构建过程,因为该过程会查询 git、获取哈希、更新 AssemblyInfo.cs
,然后构建产品。
由于我对这一切还很陌生,我想知道是否:
- 我是不是在概念上遗漏了什么?
- 有比构建更好的方法吗?
- 如果使用构建过程是可行的方法,是否有任何行之有效的处理方法?
谢谢!
散列(对于 git,一个 sha1)密封提交的所有内容。如果提交中只有一件事发生变化,文件的内容或提交的元数据(提交日期、提交消息、作者……),则哈希将不同。
在这种情况下,您了解您无法 获取提交哈希、修改文件内容和修改提交并期望提交具有相同的哈希!
因此,如果您想对程序集进行版本控制,则必须在编译解决方案之前在构建过程中使用提交哈希更新 AssemblyInfo.cs
文件。
对于那些好奇的人,这是我最终使用的解决方案。
在确认我确实了解整个 commit/hash 的工作原理后,我开始更多地研究构建过程。事实证明这很容易。这 article 让我朝着正确的方向前进。这是我所做的:
- 使用 NuGet 向项目添加了 MSBuildTasks
- 设置 .csproj 文件以使用它的两个任务
- GitDescribe
- 装配信息
- 已从存储库中删除 AssemblyInfo.cs
- 现在在项目文件中设置版本(主要、次要和补丁)
现在,每次我构建时,它都使用项目文件中设置的版本,并使用自上次标记以来的提交 AssemblyFileVersion
并通过重建将散列放入 AssemblyInformationalVersion
整个 AssemblyInfo.cs 文件。
三个注意事项:
- 您必须至少有一个标签,否则它会出错(git 描述错误)
- 除非在 git 下,否则不会构建。 IE。如果你做一个存档并尝试构建它,它就会爆炸。
- 仅适用于带注释的标签。
我暂时可以忍受。
感谢您的帮助!
我的公司刚开始使用 git,我正在为版本控制而苦恼。我们正在使用语义版本控制 (major.minor.patch),我们根据对产品所做的更改进行设置。但是,我想使用第四部分来指示 git 提交。我读过有关如何执行此操作的文章,尤其是使用 post-merge hook 的文章,但我越深入,就越感到困惑,不是在技术部分,而是在概念部分。
我真的很喜欢能够在版本中使用 git 提交哈希的想法,因为它非常清楚软件是什么。但是,直到 提交后我才知道这一点,此时更改版本将需要另一次提交,并且哈希将不正确。因此,如果我得到一个版本号,请转到 git,我实际上会在使用中之前获得提交。我想要的是能够转到 git,获取标签并按照使用中的方式完全构建它。
我怀疑答案在于构建过程,因为该过程会查询 git、获取哈希、更新 AssemblyInfo.cs
,然后构建产品。
由于我对这一切还很陌生,我想知道是否:
- 我是不是在概念上遗漏了什么?
- 有比构建更好的方法吗?
- 如果使用构建过程是可行的方法,是否有任何行之有效的处理方法?
谢谢!
散列(对于 git,一个 sha1)密封提交的所有内容。如果提交中只有一件事发生变化,文件的内容或提交的元数据(提交日期、提交消息、作者……),则哈希将不同。
在这种情况下,您了解您无法 获取提交哈希、修改文件内容和修改提交并期望提交具有相同的哈希!
因此,如果您想对程序集进行版本控制,则必须在编译解决方案之前在构建过程中使用提交哈希更新 AssemblyInfo.cs
文件。
对于那些好奇的人,这是我最终使用的解决方案。
在确认我确实了解整个 commit/hash 的工作原理后,我开始更多地研究构建过程。事实证明这很容易。这 article 让我朝着正确的方向前进。这是我所做的:
- 使用 NuGet 向项目添加了 MSBuildTasks
- 设置 .csproj 文件以使用它的两个任务
- GitDescribe
- 装配信息
- 已从存储库中删除 AssemblyInfo.cs
- 现在在项目文件中设置版本(主要、次要和补丁)
现在,每次我构建时,它都使用项目文件中设置的版本,并使用自上次标记以来的提交 AssemblyFileVersion
并通过重建将散列放入 AssemblyInformationalVersion
整个 AssemblyInfo.cs 文件。
三个注意事项:
- 您必须至少有一个标签,否则它会出错(git 描述错误)
- 除非在 git 下,否则不会构建。 IE。如果你做一个存档并尝试构建它,它就会爆炸。
- 仅适用于带注释的标签。
我暂时可以忍受。
感谢您的帮助!