JGit перечисляет удаленные теги и сортирует по дате создания

Мне нужно перечислить теги удаленного репозитория Git и отсортировать их по дате создания через API JGit 3.2.0.

Не нашел способ с lsremote, поэтому у меня только сортировка по имени:

System.out.println("Listing remote repository " + REMOTE_URL);
Collection<Ref> tags = Git.lsRemoteRepository()
    .setTags(true)
    .setRemote(REMOTE_URL)
    .call();

ArrayList<Ref> taglist = new ArrayList<>(tags);
Collections.sort(taglist, new Comparator<Ref>()
{
  public int compare(Ref o1, Ref o2) {
   return o1.getName().compareTo(o2.getName());
 }
});

for (Ref ref : taglist) {
  System.out.println("Ref: " + ref.getName());
  System.out.println("ObjectId : " + ref.getObjectId());
  System.out.println("Ref short: " + Repository.shortenRefName(ref.getName()));
  }
}

Как отсортировать теги по дате создания?

Он работает с локальным репозиторием, т.е. после клонирования репозитория:

// open a cloned repository
FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repository = builder.setGitDir(new File(localPath + "/.git"))
  .readEnvironment()
  .findGitDir()
  .build();

final RevWalk walk = new RevWalk(repository);
List<Ref> call = new Git(repository).tagList().call();
RevTag rt;

Collections.sort(call, new Comparator<Ref>()
{
  public int compare(Ref o1, Ref o2)
  {
    java.util.Date d1 = null;
    java.util.Date d2 = null;
    try
    {
      d1 = walk.parseTag(o1.getObjectId()).getTaggerIdent().getWhen();
      d2 = walk.parseTag(o2.getObjectId()).getTaggerIdent().getWhen();

    } catch (IOException e)
    {
      e.printStackTrace();
    }
    return d1.compareTo(d2);
  }
});

Есть ли другой способ без необходимости сначала клонировать репозиторий?


person Rebse    schedule 27.01.2014    source источник


Ответы (1)


Нет, не возможно. Интерфейс ls-remote не показывает время создания тегов. Вам придется клонировать Git (или, по крайней мере, получить все его теги, что в большинстве случаев будет в значительной степени эквивалентно клонированию git).

person Magnus Bäck    schedule 27.01.2014
comment
Итак, мой второй фрагмент — после клонирования репозитория — является наиболее достаточным? Можно ли как-то расширить интерфейс lsremote? - person Rebse; 28.01.2014
comment
@Rebse: Да, ваш второй фрагмент кода выглядит разумно (но я действительно не знаю JGit). Изменение протокола объявления ссылок Git весьма нетривиально и вряд ли произойдет. - person Magnus Bäck; 28.01.2014
comment
Любая альтернатива Git Api для Java помимо JGit? - person Rebse; 28.01.2014
comment
@Rebse: Не то, чтобы я знал. Но чтобы было ясно, это не ограничение JGit, это связано с (разумным) выбором дизайна, сделанным в проводных протоколах Git. - person Magnus Bäck; 28.01.2014
comment
Начиная с git 2.18.0 команда ls-remote поддерживает параметр --sort (см. github.com/git/git/blob/master/Documentation/RelNotes/). - person yurodivuie; 05.02.2020