如何使用LibGit2Sharp找出远程注释标签的提交ID?

时间:2014-10-14 15:08:04

标签: tags libgit2sharp

使用repo.Network.ListReferences为我提供了引用的TargetIdentifier,但是在带注释的标记的情况下,它指向标记的ObjectId。我如何找到CommitId?

1 个答案:

答案 0 :(得分:0)

仅通过利用repo.Network.ListReferences无法检索带注释标记的目标。

您首先必须通过以下方式在本地获取:

  • 检索所有标签(仅检索新的/更新的标签)。有关指导,请参阅此 test
  • 选择您感兴趣的那些并利用较低级Fetch()重载,该重载接受一组refspec并传递new[]{ "refs/tags/v0.1:refs/tags/v0.1", "refs/tags/v1.32:refs/tags/v1.32" }。有关获取自定义refspecs的一些指导,请参阅此 test
  

如何查找CommitId?

  • 提取引用后,在本地解析标记(例如Tag myTag = repo.Tags["v1.32"];)。

  • 当标签被注释时(即不是轻量级标签),myTag.IsAnnotated属性将设置为truemyTag.Annotation.Target将指向{{1标签指出。

如果检索到的GitObject是GitObject,访问其Commit属性应该回答您的问题。

请注意,尽管不是常见情况,但标签可能指向除Id之外的其他内容。例如CommitBlob。人们甚至可以在野外找到带链接注释的标签(在这种情况下,您必须以递归方式解析每个Tree的{​​{1}},直到它不再是Target

FWIW,有一个 open up-for-grabs issue 关于公开一种更友好的方式来检索最终的去皮目标。

有关使用LibGit2Sharp进行标记操作的更全面视图,请参阅 TagFixture.cs 测试套件。