我需要用C#以编程方式获取Git历史中特定行的最后一位作者。我尝试使用libgit2sharp:
var repo = new LibGit2Sharp.Repository(gitRepositoryPath);
string relativePath = MakeRelativeSimple(filename);
var blameHunks = repo.Blame(relativePath);
// next : find the hunk which overlap the desired line number
但这相当于命令
git blame <file>
事实上我需要
git blame -w <file>
(比较时忽略空白)
Libgit2sharp不设置-w
开关,也不提供任何参数/选项进行设置。我有什么选择?您知道其他与blame
命令的-w
开关兼容的库吗?
当我遇到类似的高级场景,其中git lib没有切割它时,我只是使用startprocess将其扩展到真正的git命令行。它不性感,但非常有效。
也许使用NGIT库会有所帮助。这是java JGIT库的直接(自动)端口。通过nuget软件包安装,然后:
static void Main() {
var git = Git.Init().SetDirectory("C:\MyGitRepo").Call();
string relativePath = "MyFolder/MyFile.cs";
var blameHunks = git.Blame().SetFilePath(relativePath).SetTextComparator(RawTextComparator.WS_IGNORE_ALL).Call();
blameHunks.ComputeAll();
var firstLineCommit = blameHunks.GetSourceCommit(0);
// next : find the hunk which overlap the desired line number
Console.ReadKey();
}
注意SetTextComparator(RawTextComparator.WS_IGNORE_ALL)部分。
不幸的是,libgit2sharp提取指责的速度太慢,在实际场景中使用此功能是不切实际的。因此,我认为最好的方法是使用Powershell脚本来使用底层的超高速原生git。然后将结果重定向到您的应用程序。
git blame -l -e -c {commit-sha} -- "{file-path}" | where { $_ -match '(?<sha>w{40})s+(<(?<email>[w.-]+@[w-]+.w{2,3})>s+(?<datetime>dddd-dd-ddsdd:dd:dds-dddd)s+(?<lineNumber>d+))w*' } |
foreach { new-object PSObject –prop @{ Email = $matches['email'];lineNumber = $matches['lineNumber'];dateTime = $matches['dateTime'];Sha = $matches['sha']}}