使用GitVersion

时间:2017-06-19 20:52:04

标签: git semantic-versioning gitversion

有没有办法配置GitVersion使用缩短版(例如,6个字符长)的哈希值进行版本编号?

即;

1.2.3-unstable645 Branch:'develop' Sha:'a682956dccae752aa24597a0f5cd939f93614509'

变为

1.2.3-unstable645 Branch:'develop' Sha:'a68295'

熵应该意味着额外的字符(过去,比如6,1.6^10*7排列)没有提供明确的识别,但如果需要显示,则使版本更短。

2 个答案:

答案 0 :(得分:0)

GitVersion发出断言版本号的许多不同部分,每个部分都可用于形成所需的版本号,但是,缩短的sha不是其中之一。以下是当前声明的所有变量:

{
  "Major":0,
  "Minor":21,
  "Patch":0,
  "PreReleaseTag":"",
  "PreReleaseTagWithDash":"",
  "PreReleaseLabel":"",
  "PreReleaseNumber":"",
  "BuildMetaData":"",
  "BuildMetaDataPadded":"",
  "FullBuildMetaData":"Branch.hotfix/0.21.1.Sha.57e16a787815c5e27c3a0edbf5224b3df64f1a69",
  "MajorMinorPatch":"0.21.0",
  "SemVer":"0.21.0",
  "LegacySemVer":"0.21.0",
  "LegacySemVerPadded":"0.21.0",
  "AssemblySemVer":"0.21.0.0",
  "FullSemVer":"0.21.0",
  "InformationalVersion":"0.21.0+Branch.hotfix/0.21.1.Sha.57e16a787815c5e27c3a0edbf5224b3df64f1a69",
  "BranchName":"hotfix/0.21.1",
  "Sha":"57e16a787815c5e27c3a0edbf5224b3df64f1a69",
  "NuGetVersionV2":"0.21.0",
  "NuGetVersion":"0.21.0",
  "CommitsSinceVersionSource":0,
  "CommitsSinceVersionSourcePadded":"0000",
  "CommitDate":"2017-07-14"
}

假设您正在使用某种形式的构建脚本,您可以手动缩短断言的sha,然后将其与其他必需变量组合以获得所需的版本号。

答案 1 :(得分:0)

  

熵应该意味着附加字符(过去,比如6,1.6 ^ 10 * 7排列)没有给出明显的识别,但如果需要显示则使版本更短

不确定您的数学,但开发人员通常只使用Git哈希的前六位,八位或十二位作为标识符。对于任何给定的小型回购,碰撞是不太可能的,但是definitely possible。我看过使用较短版本的工具仅用于显示目的,但在内部,它们使用完整的40个字符哈希值。

如果您正在构建SemVer字符串,则可以在缩写或完整格式中嵌入分支名称和提交哈希:

1.2.3-unstable645+develop.a68295

我的偏好一直是使用完整哈希:

1.2.3-unstable645+develop.a682956dccae752aa24597a0f5cd939f93614509

我也看过使用前六位和后六位的方案:

1.2.3-unstable645+develop.a68295-614509

回到你的数学...... SHA-1发出一个160位(20字节)的散列,需要40个字节才能以十六进制完整显示。对于输入中的每个变化,该算法相当好地在所有160位上分配比特变化。仅使用散列中的6个字符意味着您只获得3个字节(24位)的散列值,因此:

2^160 ~= 1.461502e+48
2^24  ~= 1.677722e+7

碰撞概率相当大。

你真的需要几位数?事实证明,该数字取决于您的存储库中的提交历史记录。 Git命令具有允许您匹配最短匹配唯一前缀的功能,而不必指定整个哈希。在你的历史中只有一次提交,那么它可能是一个数字,但是承诺堆积,这个数字总是增加。一些高活动回购(例如linux内核)需要至少11位数来唯一标识它们包含的每个提交,但该数字将随着时间的推移而继续增加。

所有这些的主要内容是存在那些将在其散列的前N个数字中具有散列冲突的存储库,其中N <1。 12.其中一些包含前六位数千次碰撞!你的里程会有所不同。