Список коммитов, связанных с данным тегом с помощью JGit

Мне нужно создать файл истории, который детализирует все теги и для каждого тега, все его коммиты.

Я пытался позвонить getTags() на объекте хранилища и использовать эти идентификаторы объекта, но они не являются идентификаторами коммитов.

Я также пытался использовать getAllRefsByPeeledObjectId() в репозитории, и это возвращает коммиты, но я не могу связать их с тегами.

Есть идеи?

2 ответа

Список всех тегов:

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

Список коммитов на основе тега:

Я бы использовал команду log, основанную на имени тега, с очищенной магией, как заметил Рюдигер:

        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 для некоторых связанных примеров.

Чтобы получить список тегов, вы можете использовать Repository#getTags() или ListTagCommand,

В Git есть аннотированные и аннотированные теги. В то время как аннотированные теги напрямую указывают на коммит, в который они были помещены, аннотированный тег указывает на объект git, который содержит - среди других метаданных, таких как сообщение, - идентификатор фиксации.

Тест обучения ниже иллюстрирует это:

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.

Чтобы сказать одну форму другой, вы можете очистить ссылку и затем проверить, если его getPeeledObjectId() возвращает ненулевое значение

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

Идентификатор очищенного объекта - это тот, который указывает на коммит, на котором был создан аннотированный тег.

Другие вопросы по тегам