JGit和查找Head

30

我正在尝试使用JGit获取最新的提交(HEAD commit):

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,即来自http://download.eclipse.org/jgit/maven2.0.0.201206130900-r
我的问题是:我需要在我的代码中做哪些改变才能使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。我尝试了不同的存储库,包括我的和其他人的。


2
很抱歉我不知道这个问题的答案。我只是有一个评论,与其说“我正在使用最新版本的JGit”,你应该说明确切的版本号。如果一年后有人读到这个问题并遇到类似的问题,他们怎么知道当初你所说的“最新版本”是哪个版本呢? - Code-Apprentice
5个回答

31
你需要在调用 `setGitDir` 时指向 Git 元数据目录(可能是 `/www/test-repo/.git`),而不是工作目录(`/www/test-repo`)。
我必须承认我不确定 `findGitDir` 应该做什么,但我之前遇到过这个问题,指定 `.git` 目录可以解决。

我认为(但我不确定我从未掌握过这个机制),更具体地说,他应该使用setGitDir或findGitDir中的一个,而不是两者都用。但是是的,在找到正确的组合之前,我经历了很多麻烦。 - Vince
我刚刚确认使用 setGitDir 指定元数据目录是有效的,而且似乎无论是否添加 findGitDir 都没有任何区别。 - Travis Brown
这里有一个例子:https://github.com/centic9/jgit-cookbook/blob/master/src/main/java/org/dstadler/jgit/OpenRepository.java - MewX

6
为了完整起见,这里是一个完全可用的示例,说明如何获取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;
}

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();

1
你也可以使用val git: Git = Git.open(new File("/www/test-repo"))。JGit将会扫描给定的文件夹寻找git元目录(通常是.git)。如果它无法找到该文件夹,将抛出一个IOException异常。

0

关于findGitDir()的使用信息并不多,所以我想在这里分享我的发现。因此,请使用以下代码从工作树的任何位置设置JGit Repository对象:

RepositoryBuilder repositoryBuilder = new RepositoryBuilder();

Repository repo = repositoryBuilder
  .findGitDir(new File("~/workspace/project1/src/main/java"))
  .setMustExist(true)
  .build();

在我的情况下,我使用repo来检查它的状态:
Git git = Git.wrap(repo);
git.status().call();

代码基于JGit 5.10.0.202012080955-r版本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接