28

我正在尝试使用 JGit 进行 HEAD 提交:

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)

我发现它可以很好地打开 repo,但head值设置为null. 我想知道为什么它找不到HEAD?

我正在阅读这份文档:http ://wiki.eclipse.org/JGit/User_Guide

存储库的构建就像文档所说的RevWalk那样,也是如此。我正在使用2.0.0.201206130900-r来自http://download.eclipse.org/jgit/maven的最新版本的 JGit 。

我的问题:我需要在我的代码中进行哪些更改才能让 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。我尝试了不同的存储库,我的和其他人的。

4

4 回答 4

29

调用时需要指向 Git 元数据目录(可能/www/test-repo/.gitsetGitDir,而不是工作目录(/www/test-repo)。

我不得不承认我不确定findGitDir应该做什么,但我之前遇到过这个问题并且指定.git目录有效。

于 2012-09-09T21:57:54.373 回答
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;
}
于 2016-10-13T13:57:16.370 回答
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();
于 2016-10-02T14:02:05.847 回答
1

您也可以使用val git: Git = Git.open( new File( "/www/test-repo" ) ). 然后 JGit 将扫描给定文件夹中的 git 元目录(通常是.git)。如果找不到此文件夹,IOException则会抛出 an 。

于 2016-07-10T21:13:29.810 回答