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 в репозитории. Я пробовал разные репозитории, свои и чужие.


person Tower    schedule 09.09.2012    source источник
comment
Мне жаль, что я не знаю ответа на этот вопрос. У меня просто есть комментарий, что вместо того, чтобы говорить, что я использую последнюю версию JGit, вы должны указать точный номер версии. Что, если кто-то с похожей проблемой прочитает этот вопрос через год? Как они узнают, какая версия была последней, когда вы первоначально задали вопрос?   -  person Code-Apprentice    schedule 10.09.2012


Ответы (4)


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

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

person Travis Brown    schedule 09.09.2012
comment
Я думаю (но я не уверен, что никогда не понимал механики этого), что, более конкретно, он должен использовать либо setGitDir, либо findGitDir, а не оба. Но да, я прошел через много проблем, прежде чем нашел правильную комбинацию. - person Vince; 10.09.2012
comment
Я только что подтвердил, что указание каталога метаданных с помощью setGitDir работает, и, похоже, не имеет значения, добавляете ли вы findGitDir или нет. - person Travis Brown; 10.09.2012
comment
И вот пример: github.com/centic9/jgit-cookbook/blob/master/src/main/java/org/ - person MewX; 09.04.2018

Для меня (используя 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();
person Ed Randall    schedule 02.10.2016

Для полноты картины вот полностью рабочий пример получения хэша для коммита 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;
}
person chao    schedule 13.10.2016

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

person Taig    schedule 10.07.2016