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. Я пробовал разные репозитории, мои и других людей.
Ответы
Ответ 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;
}