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

YaO*_*aOg 5 java jgit

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

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

我也试图getAllRefsByPeeledObjectId()在存储库上使用它确实带回了提交但我不能将它们与标签相关联.

有任何想法吗?

cen*_*tic 5

列出所有标签:

List<Ref> call = new Git(repository).tagList().call();
for (Ref ref : call) {
    System.out.println("Tag: " + ref + " " + ref.getName() + " " + ref.getObjectId().getName());
}
Run Code Online (Sandbox Code Playgroud)

根据标签列出提交:

如Rüdiger所指出的,我将使用基于标签名称的log-command以及如魔术般脱皮的魔术:

        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() */);
        }
Run Code Online (Sandbox Code Playgroud)

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


Rüd*_*ann 4

要获取标签列表,您可以使用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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

要区分一种形式,您可以剥离引用,然后测试它是否getPeeledObjectId()返回非空。

Ref peeledRef = git.getRepository().peel( tagRef );
boolean annotatedTag = peeledRef.getPeeledObjectId() != null;
Run Code Online (Sandbox Code Playgroud)

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