Ref Object的getPeeledObjectId()和getObjectId()有什么区别?

我正在使用jgit api来实现我的项目的构建,部署function( 在本地机器中 )。 我通过命令提示符通过以下命令提交了整个源代码(java项目)

  1. git add .
  2. git commit -a -m "Initial_Source"

    这里我得到的提交ID为cb96c685a5a4338f852a782631df8d1cf5dca21d

  3. git tag Initial_Source cb96c685a5a4338f852a782631df8d1cf5dca21d

    [cb96c685a5a4338f852a782631df8d1cf5dca21d是commitid]

  4. git push

  5. git push --tags

但是当我试图通过getPeeledObjectId()获取提交id时,它返回null

我的代码是

 Ref tag = git.getRepository().getRef("Initial_Source"); Ref peeledRef = git.getRepository().peel(tag); return peeledRef.getPeeledObjectId(); -- this is returning null 

但我尝试使用getObjectId()而不是getPeeledObjectId() getObjectId() 。 它给出了commitId。 但我想知道何时使用getPeelObjectId()getObjectId()

那些方法是什么?

getPeeledObjectId()方法在非注释(轻量级)标记上始终为null:

  git tag Initial_Source cb96c685a5a4338f852a782631df8d1cf5dca21d 

这适用于带注释的标签

 git tag -a Initial_Source cb96c685a5a4338f852a782631df8d1cf5dca21d # or git tag -m "Initial Source" Initial_Source cb96c685a5a4338f852a782631df8d1cf5dca21d 

由于你的标签是一个指向提交的指针(由git.getRepository().peel(tag)引用), getObjectId()得到它的id,没有什么可以“剥离”了:你已经有了提交。
请参阅“ 带注释和未注释的标记之间有什么区别? ”

参见porcelain/ListTags.java示例 :它考虑了两种标签:

 List call = git.tagList().call(); for (Ref ref : call) { System.out.println("Tag: " + ref + " " + ref.getName() + " " + ref.getObjectId().getName()); // fetch all commits for this tag LogCommand log = git.log(); Ref peeledRef = repository.peel(ref); if(peeledRef.getPeeledObjectId() != null) { // Annotated tag log.add(peeledRef.getPeeledObjectId()); } else { // Lightweight tag log.add(ref.getObjectId()); } } 
  • 正如@VonC所说,我认为我们无法从getPeeledObjectId()获得轻量级标签的ObjectId(即没有-a或-m的标签)。
  • 我试图提交一个文件,并在没有-a或-m的情况下标记该文件

    [ git tag Initial_Source cb96c685a5a4338f852a782631df8d1cf5dca21d ]。

  • 然后运行java主程序从getPeeledObjectId()获取对象Id,这显然返回null。

  • 然后我提交一个文件然后用-a和-m标记它(任何1足以作为带注释的标签)

    [ git tag Appinterface 523a05f9c486e64eba29786a1b8abfc4da421260 -m“Appinterface_commit_tag” ]

  • 现在我从getPeeledObjectId()获取objectId