Working with a Bare Repository in JGit
As I mentioned in my previous blog ‘JGit by example’, we use JGit a lot in our application, Nuxeo Studio. A fundamental part of Nuxeo Studio development is the testing of the versioning feature. While testing this, we faced a challenging question: How could we test the application using a mock remote Git repository in our unit tests? We wanted something easy to implement that could provide the same features as a proper Git server.
The solution we chose was to use a local bare repository to represent the distant repository and to clone it on a local working directory.
So, in this blog, I will explain how to create and work with bare repository using JGit.
Create a Bare Repository Using JGit
The creation of a bare repository is similar to the creation of a working directory. It is the same method
Repository.createbut with the
bareparameter set to
// Create a folder in the temp folder that will act as the remote repository
File remoteDir = File.createTempFile("remote", "");
// Create a bare repository
FileKey fileKey = FileKey.exact(remoteDir, FS.DETECTED);
Repository remoteRepo = fileKey.open(false);
Start to Use the Bare Repository
Now that we have created the bare repository, we can clone it to start using it in our tests. Let’s start with the creation of a new file and a first commit.
// Clone the bare repository
File cloneDir = File.createTempFile("clone", "");
Git git = Git.cloneRepository().setURI(remoteRepo.getDirectory().getAbsolutePath()).setDirectory(cloneDir).call();
// Let's to our first commit
// Create a new file
File newFile = new File(cloneDir, "myNewFile");
FileUtils.write(newFile, "Test content file");
// Commit the new file
git.commit().setMessage("First commit").setAuthor("gildas", "[email protected]").call();
If you want more details on the JGit commands for the commit, I would recommend reading the blog ‘JGit by example’. To fully test the bare repository, we will now push the commit on the bare repository and create a second working directory to pull the modifications.
// Push the commit on the bare repository
RefSpec refSpec = new RefSpec("master");
// Create a second working directory
File cloneDir2 = File.createTempFile("clone", "");
Git git2 = Git.cloneRepository().setURI(remoteRepo.getDirectory().getAbsolutePath()).setDirectory(cloneDir2).call();
After cloning the bare repository, the commit that was done there is now present in the new working directory and our purpose is achieved! We now have a basic setup for testing the sharing features of Git without having to deploy a complete Git server.
The complete test class is available here. Check it out!
Category: Product & Development