使用 jGit 构建标签会将其绑定到意外的 ObjectId

Building a tag with jGit binds it to an unexpected ObjectId

在以下代码片段中:

Git git = Git.init().setDirectory(path).call();
File testfile = new File(path, "testfile");
testfile.createNewFile();
git.add().addFilepattern("testfile").call();
RevCommit commit = git.commit().setMessage("test commit #1").call();
Ref tag = git.tag().setObjectId(commit).setName("tag1.0").call();

System.out.println("HEAD: " + git.getRepository().resolve(Constants.HEAD));
System.out.println("COMMIT: " + commit.toString());
System.out.println("TAG: " + tag.getObjectId());

我打印了以下内容:

AnyObjectId[1f74b8249ea41ebbe3305536def4b430130d366c]
commit 1f74b8249ea41ebbe3305536def4b430130d366c 1638417816 ------p
AnyObjectId[10fcef4b65f98c227c0639d207ee8f550c030b92]

提交 10fcef4b65f98c227c0639d207ee8f550c030b92 没有出现在存储库的任何地方,这个标识符是从哪里来的?最重要的是,为什么 tag.getObjectId() 不是 return 应该指向的标识符 1f74b8249ea41ebbe3305536def4b430130d366c

我已经尝试了很多事情,我可以从标记中获取正确的提交引用的唯一方法是调用 RevTag::getObject()RevTag 通过 RevWalk 获取)。

默认情况下,JGit 的 TagCommand 创建一个带注释的标签。 正如 @torek 评论的那样,returned ref 指向标签对象。

要创建未注释的标签,请使用 setAnnotated(false)。然后该命令将 return 一个指向标记提交的引用。

此 post 解释了如何查看带注释标签的目标提交 ID 以及如何在 JGit 中区分带注释和未带注释的标签: List commits associated with a given tag with JGit