使用repo。Network.ListReferences为我提供了引用的TargetIdentifier,但如果是带注释的标记,则指向标记的ObjectId。如何查找CommitId?
仅利用repo.Network.ListReferences
无法检索带注释标记的目标。
您首先必须通过以下方式在本地获取:
- 检索所有标签(只检索新的/更新的标签)。请参阅此测试以获取一些指导
- 例如,选择您感兴趣的并利用接受refspecs集合的较低级别
Fetch()
重载并传递new[]{ "refs/tags/v0.1:refs/tags/v0.1", "refs/tags/v1.32:refs/tags/v1.32" }
。有关获取自定义refspec的一些指导,请参阅测试
如何查找CommitId?
-
获取引用后,在本地解析标记(例如
Tag myTag = repo.Tags["v1.32"];
)。 -
当标记被注释(即不是轻量级标记)时,
myTag.IsAnnotated
属性将被设置为true
,myTag.Annotation.Target
将指向标记所指向的GitObject
。
如果检索到的GitObject是Commit
,那么访问其Id
属性应该可以回答您的问题。
注意,尽管不是经常发生的情况,但标签可能指向Commit
以外的其他东西。例如Blob
或Tree
。人们甚至可以在野外找到链式注释标签(在这种情况下,您必须递归地解析每个TagAnnotation
的Target
,直到它不再是TagAnnotation
FWIW,有一个可供争夺的问题关于暴露一种更友好的方法来检索最终剥离的目标。
有关使用LibGit2Sharp进行标记操作的更全面视图,请参阅TagFixture.cs测试套件。