如何在PS脚本中获取Git提交哈希?

Jez*_*Jez 1 git msbuild powershell

我正在使用PowerShell脚本调用msbuild并将版本号传递给OctopusDeploy,如下所示:

msbuild "Xyz.sln" /t:Rebuild /p:Configuration=Release /p:RunOctoPack=true /p:OctopackPackageVersion=$versionNumber
Run Code Online (Sandbox Code Playgroud)

...在PS脚本中生成$ versionNumber.我想要做的是将Git提交哈希的前16个字符添加到版本字符串的末尾,这样它最终看起来像:

2.yyyyMMdd.HHmmss-git-6d34e44340f95c2a
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我可以得到msbuild或Visual Studio以某种方式返回当前的git commit hash,考虑到他们现在有内置的Git支持吗?

Mar*_*ich 6

您实际上可以直接在msbuild中执行此操作,以便它可以在VS和大多数CI系统中运行而无需任何额外步骤(例如PowerShell脚本),即使在跨平台dotnetCLI和单声道上也是如此.

您可以Directory.Build.targets使用以下内容创建项目或解决方案(>影响所有项目)目录中的文件(假设MSBuild 15/VS 2017.如果更低,则需要手动导入或将此目标插入到每个项目中)

<Project>
  <Target Name="DetermineOctopackVersion" BeforeTargets="Build" Condition=" '$(RunOctoPack)' == 'true' ">
    <Exec Command="git rev-parse HEAD" ConsoleToMSBuild="true" StandardOutputImportance="low">
      <Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHash" />
    </Exec>
    <PropertyGroup>
      <VersionDatePart>$([System.DateTime]::get_Now().ToString(yyyyMMdd.HHmmss))</VersionDatePart>
      <OctopackPackageVersion>2.$(VersionDatePart)-git-$(GitCommitHash.Substring(0,16))</OctopackPackageVersion>
    </PropertyGroup>
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

如果您希望属性上每次构建设置,不仅当RunOctoPacktrue时,只要将Condition属性.

但是如果您需要在PowerShell中执行此操作,则可以调用git命令并捕获其输出:

$commitHash = (git rev-parse HEAD).Substring(0,16)
$versionDatePart = [System.DateTime]::Now.ToString('yyyyMMdd.HHmmss')
$version = "1.$versionDatePart-git-$commitHash"
Run Code Online (Sandbox Code Playgroud)

如果你真的想避免调用git(虽然没有正确的构建系统设置完成没有git安装..)你也可以使用[System.IO.File]::ReadAllText(".git\refs\heads\master")PS或MSBuild来读取git目录(在分离状态,.git\HEAD将包含哈希,当使用分支它将包含查找散列的文件的位置.

  • 最好的做法是使用用于设置构建的git版本..你可以在其他版本中加载libgit#或者自己查找文件但我强烈建议使用`git.exe`方法它是最多的跨平台的(个人而言,我不认为没有git安装的环境不是开发或构建环境) (2认同)