Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JGit and finding the Head

Tags:

java

git

scala

jgit

I'm trying to get my hands on the HEAD commit with 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) 

I find that it opens the repo fine, but head value is set to null. I wonder why it can't find HEAD?

I'm reading this documentation: http://wiki.eclipse.org/JGit/User_Guide

The repository is constructed just like the doc says, and the RevWalk as well. I'm using the latest version of JGit which is 2.0.0.201206130900-r from http://download.eclipse.org/jgit/maven.

My question: what do I need to change in my code to get JGit to return actual instances of RevCommit instead of null like it now does?

Update: This code:

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

Gives me this exception: No HEAD exists and no explicit starting revision was specified

The exception is odd, because a simple git rev-parse HEAD tells me 0b0e8bf2cae9201f30833d93cc248986276a4d75, which means there is a HEAD in the repository. I've tried different repositories, mine and from other people.

like image 793
Tower Avatar asked Sep 09 '12 19:09

Tower


People also ask

How does JGit work?

JGit is a lightweight, pure Java library implementation of the Git version control system – including repository access routines, network protocols, and core version control algorithms. JGit is a relatively full-featured implementation of Git written in Java and is widely used in the Java community.

What is RevWalk?

Walks a commit graph and produces the matching commits in order. A RevWalk instance can only be used once to generate results. Running a second time requires creating a new RevWalk instance, or invoking reset() before starting again.


2 Answers

You need to point to the Git metadata directory (probably /www/test-repo/.git) when you call setGitDir, not to the working directory (/www/test-repo).

I have to admit I'm not sure what findGitDir is supposed to do, but I've run into this problem before and specifying the .git directory worked.

like image 184
Travis Brown Avatar answered Sep 21 '22 11:09

Travis Brown


For the completeness sake, here is a fully working example how to get the hash for the HEAD commit:

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; } 
like image 41
chao Avatar answered Sep 21 '22 11:09

chao