Подтвердить что ты не робот

JGit и поиск главы

Я пытаюсь взять на себя команду HEAD с помощью JGit:

val builder = new FileRepositoryBuilder()
val repo = builder.setGitDir(new File("/www/test-repo"))
  .readEnvironment()
  .findGitDir()
  .build()

val walk: RevWalk = new RevWalk(repo, 100)

val head: ObjectId = repo.resolve(Constants.HEAD)
val headCommit: RevCommit = walk.parseCommit(head)

Я обнаружил, что он открывает репо, но значение head установлено на null. Интересно, почему он не может найти HEAD?

Я читаю эту документацию: http://wiki.eclipse.org/JGit/User_Guide

Репозиторий построен так же, как говорит документ, и RevWalk. Я использую последнюю версию JGit, которая 2.0.0.201206130900-r из http://download.eclipse.org/jgit/maven.

Мой вопрос: что мне нужно изменить в моем коде, чтобы заставить JGit возвращать действительные экземпляры RevCommit вместо null, как это сейчас делает?

Обновление: Этот код:

val git = new Git(repo)
val logs: Iterable[RevCommit] = git.log().call().asInstanceOf[Iterable[RevCommit]]

Дает мне это исключение: No HEAD exists and no explicit starting revision was specified

Исключение является нечетным, потому что простой git rev-parse HEAD сообщает мне 0b0e8bf2cae9201f30833d93cc248986276a4d75, что означает, что в репозитории есть HEAD. Я пробовал разные репозитории, мои и других людей.

4b9b3361

Ответ 1

Вам нужно указать каталог метаданных Git (возможно, /www/test-repo/.git), когда вы вызываете setGitDir, а не в рабочий каталог (/www/test-repo).

Я должен признать, что я не уверен, что должен делать findGitDir, но я столкнулся с этой проблемой до и указав каталог .git.

Ответ 2

Вы также можете использовать val git: Git = Git.open( new File( "/www/test-repo" ) ). Затем JGit сканирует данную папку для метакаталога git (обычно .git). Если он не сможет найти эту папку, будет выброшен IOException.

Ответ 3

Для меня (с использованием 4.5.0.201609210915-r) решение должно было использовать только RepositoryBuilder вместо FileRepositoryBuilder. Пока я не сделал это изменение, все методы возвращали null.

rb = new org.eclipse.jgit.lib.RepositoryBuilder()
    .readEnvironment()
    .findGitDir()
    .build();

headRef = rb.getRef(rb.getFullBranch());
headHash = headRef.getObjectId().name();

Ответ 4

Для полноты использования здесь приведен полный рабочий пример, как получить хэш для фиксации HEAD:

public String getHeadName(Repository repo) {
  String result = null;
  try {
    ObjectId id = repo.resolve(Constants.HEAD);
    result = id.getName();
  } catch (IOException e) {
    e.printStackTrace();
  }
  return result;
}