使用JGit列出与给定标记关联的提交

我需要创建一个历史文件,详细说明所有标签和每个标签的所有提交。

我试图在存储库对象上调用getTags()并使用那些对象id,但它们不是提交id。

我还尝试在存储库上使用getAllRefsByPeeledObjectId() ,这确实带回了提交但我无法将它们与标记相关联。

有任何想法吗?

列出所有标签:

 List call = new Git(repository).tagList().call(); for (Ref ref : call) { System.out.println("Tag: " + ref + " " + ref.getName() + " " + ref.getObjectId().getName()); } 

列表提交基于标记:

我将使用基于tag-name的log-command和Rüdiger所指出的去皮魔法:

  LogCommand log = new Git(repository).log(); Ref peeledRef = repository.peel(ref); if(peeledRef.getPeeledObjectId() != null) { log.add(peeledRef.getPeeledObjectId()); } else { log.add(ref.getObjectId()); } Iterable logs = log.call(); for (RevCommit rev : logs) { System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); } 

有关相关示例,请参阅我的jgit-cookbook 。

要获取标记列表,您可以使用Repository#getTags()ListTagCommand

Git中有注释和未注释的标签。 虽然未注释的标签直接指向它们被放置的提交,但带注释的标签指向一个git对象 ,该对象包含其他元数据(如消息) – commit-id。

下面的学习测试说明了这一点:

 public class TagLearningTest { @Rule public final TemporaryFolder tempFolder = new TemporaryFolder(); private Git git; @Test public void testUnannotatedTag() throws Exception { RevCommit commit = git.commit().setMessage( "Tag Me!" ).call(); Ref tagRef = git.tag().setAnnotated( false ).setName( "Unannotated_Tag" ).call(); assertEquals( commit.getId(), tagRef.getObjectId() ); assertNull( git.getRepository().peel( tagRef ).getPeeledObjectId() ); } @Test public void testAnnotatedTag() throws Exception { RevCommit commit = git.commit().setMessage( "Tag Me!" ).call(); Ref tagRef = git.tag().setAnnotated( true ).setName( "Annotated_Tag" ).call(); assertEquals( commit, git.getRepository().peel( tagRef ).getPeeledObjectId() ); ObjectReader objectReader = git.getRepository().newObjectReader(); ObjectLoader objectLoader = objectReader.open( tagRef.getObjectId() ); RevTag tag = RevTag.parse( objectLoader.getBytes() ); objectReader.release(); assertEquals( commit.getId(), tag.getObject() ); } @Before public void setUp() throws GitAPIException { git = Git.init().setDirectory( tempFolder.getRoot() ).call(); } } 

在JGit中,带注释的标签由RevTag表示,该标签存储在标签ref指向的id下。

要告诉另一个表单,可以剥离 ref,然后测试它的getPeeledObjectId()返回非null。

 Ref peeledRef = git.getRepository().peel( tagRef ); boolean annotatedTag = peeledRef.getPeeledObjectId() != null; 

去皮对象id是指向创建带注释标记的提交的对象。