2017-06-19 86 views
1

有没有一种方法可以将GitVersion配置为使用缩短版本编号(例如6个字符长)的哈希值?使用GitVersion缩短提交哈希

I.e;

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

变为

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

熵应该意味着其他字符(过去的,说6,与1.6^10*7排列)提供给无显著识别反而使得版本短一点,如果需要显示。

+1

我记得,我不这么认为。我看了看,但从未发现它。 – Philippe

回答

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" 
} 

假设你正在使用某种形式的构建脚本,你可以手工缩短断言沙,再与其它所需的变量结合起来,以获得所需的版本号。

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个数字中发生散列冲突,其中一些数据包含前六位数字中的数千个冲突!你的里程会有所不同。