如何从VS/msbuild提取Git提交哈希?

如何从VS/msbuild提取Git提交哈希?,git,powershell,visual-studio-2015,hash,msbuild,Git,Powershell,Visual Studio 2015,Hash,Msbuild,情况是: 开发人员正在从他们的机器上运行PowerShell脚本,以便通过MSBuild将各种Nuget包发布到OctopusDeploy。我们希望将当前git提交的哈希(git repo的基础与.sln目录相同)作为生成的版本号的一部分。为此,我们可能需要提取当前提交的哈希并将其插入到版本号字符串中,然后作为参数传递到MSBuild中 所以问题是,我们如何从MSBuild或VisualStudio中获取此信息?不能保证开发人员会安装Git命令行,但他们至少会安装VS2015,并且内置Git支持

情况是:

开发人员正在从他们的机器上运行PowerShell脚本,以便通过MSBuild将各种Nuget包发布到OctopusDeploy。我们希望将当前git提交的哈希(git repo的基础与
.sln
目录相同)作为生成的版本号的一部分。为此,我们可能需要提取当前提交的哈希并将其插入到版本号字符串中,然后作为参数传递到MSBuild中

所以问题是,我们如何从MSBuild或VisualStudio中获取此信息?不能保证开发人员会安装Git命令行,但他们至少会安装VS2015,并且内置Git支持,所以您认为有什么方法可以从中获取最新的Git提交哈希?如果进入VisualStudioGUI并查看源代码管理部分,您可以看到散列


是否有一些与Visual Studio 2015或更高版本捆绑在一起的命令行工具将返回当前Git提交的哈希值?

您不依赖于
Git.exe的要求使这变得复杂。
但是,如果您想使用VisualStudio使用的库LibGit2Sharp并进行VisualStudio集成,您可以执行类似这样的疯狂操作

将新目标添加到项目文件中。我假设您使用的是C#,所以在以后将其添加到您的csproj中


$(MSBuildProjectDirectory)\HelloGit.cs
$([System.IO.File]::ReadAllText($(代码文件)”)
$([MSBuild]::Unescape($(CodeFileText)”)

$(CodeFileText)

这样做的目的是在当前项目目录中查找“HelloGit.cs”。其内容如下所示

您可以通过内联代码任务(例如,嵌入XML中的C#inside)来实现这一点,但由于任务相当长,我想在VS代码中将其作为一个单独的文件进行编辑

使用系统;
使用System.Collections.Generic;
使用System.Linq;
运用系统反思;
使用System.Runtime.CompilerServices;
使用系统文本;
使用LibGit2Sharp;
使用Microsoft.Build.Framework;
使用Microsoft.Build.Utilities;
命名空间自省{
公共类HelloGit:任务{
公共重写bool Execute(){
AppDomain.CurrentDomain.AssemblyResolve+=(发件人,参数)=>{
if(args.Name.Contains(“LibGit2Sharp”)){
返回Assembly.LoadFrom(“C:\\ProgramFiles(x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\LibGit2Sharp.dll”);
}
返回null;
};
GetCommit();
return!Log.HasLoggedErrors;
}
//[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInLine)]
私有void GetCommit(){
存储库=新存储库(存储库);
this.Sha1=repository.Commits.First().Id.Sha;
}
[输出]
公共字符串Sha1{get;set;}
[必需]
公共字符串存储库{get;set;}
}
}
现在,当您构建项目时,最新提交将被提取并记录为警告。这在VisualStudio和MS Build中都有效

在命令行上工作

在VisualStudio中工作

结果甚至似乎与git.exe一致。。。那很方便

备选方案1 您可以只使用
git.exe
任务

备选方案2
您可以使用PowerShell加载LibGit2Sharp程序集并调用相同的方法。

您不依赖于
git.exe的要求使这变得复杂。
但是,如果您想使用VisualStudio使用的库LibGit2Sharp并进行VisualStudio集成,您可以执行类似这样的疯狂操作

将新目标添加到项目文件中。我假设您使用的是C#,所以在以后将其添加到您的csproj中


$(MSBuildProjectDirectory)\HelloGit.cs
$([System.IO.File]::ReadAllText($(代码文件)”)
$([MSBuild]::Unescape($(CodeFileText)”)

$(CodeFileText)

这样做的目的是在当前项目目录中查找“HelloGit.cs”。其内容如下所示

您可以通过内联代码任务(例如,嵌入XML中的C#inside)来实现这一点,但由于任务相当长,我想在VS代码中将其作为一个单独的文件进行编辑

使用系统;
使用System.Collections.Generic;
使用System.Linq;
运用系统反思;
使用System.Runtime.CompilerServices;
使用系统文本;
使用LibGit2Sharp;
使用Microsoft.Build.Framework;
使用Microsoft.Build.Utilities;
命名空间自省{
公共类HelloGit:任务{
公共重写bool Execute(){
AppDomain.CurrentDomain.AssemblyResolve+=(发件人,参数)=>{
if(args.Name.Contains(“LibGit2Sharp”)){
返回Assembly.LoadFrom(“C:\\ProgramFiles(x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\LibGit2Sharp.dll”);
}
返回null;
};
GetCommit();
return!Log.HasLoggedErrors;
}
//[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInLine)]
私有void GetCommit(){
存储库=新存储库(存储库);
this.Sha1=repository.Commits.First().Id.Sha;
}
[输出]
公共字符串Sha1{get;set;}
[必需]
公共字符串存储库{get;set;}