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

时间:2014-11-26 13:01:57

标签: java jgit

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

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

列出所有标签:

List<Ref> 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<RevCommit> logs = log.call();
        for (RevCommit rev : logs) {
            System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */);
        }

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

答案 1 :(得分:3)

要获取代码列表,您可以使用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表示,该getPeeledObjectId()存储在标签ref指向的id下。

要告诉另一个表单,你可以剥离 ref,然后测试它的Ref peeledRef = git.getRepository().peel( tagRef ); boolean annotatedTag = peeledRef.getPeeledObjectId() != null; 是否返回非空。

{{1}}

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