简体   繁体   中英

How do I do git push with JGit?

I'm trying to build a Java application that allows users to use Git based repositories. I was able to do this from the command-line, using the following commands:

git init
<create some files>
git add .
git commit
git remote add <remote repository name> <remote repository URI>
git push -u <remote repository name> master

This allowed me to create, add and commit content to my local repository and push contents to the remote repository. I am now trying to do the same thing in my Java code, using JGit. I was able to easily do git init, add and commit using JGit API.

Repository localRepo = new FileRepository(localPath);
this.git = new Git(localRepo);        
localRepo.create();  
git.add().addFilePattern(".").call();
git.commit().setMessage("test message").call();

Again, all of this works fine. I couldn't find any example or equivalent code for git remote add and git push . I did look at this SO question .

testPush() fails with the error message TransportException: origin not found . In the other examples I've seen https://gist.github.com/2487157 do git clone before git push and I don't understand why that's necessary.

Any pointers to how I can do this will be appreciated.

The easiest way is to use the JGit Porcelain API:

    Git git = Git.open(localPath); 

    // add remote repo:
    RemoteAddCommand remoteAddCommand = git.remoteAdd();
    remoteAddCommand.setName("origin");
    remoteAddCommand.setUri(new URIish(httpUrl));
    // you can add more settings here if needed
    remoteAddCommand.call();

    // push to remote:
    PushCommand pushCommand = git.push();
    pushCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider("username", "password"));
    // you can add more settings here if needed
    pushCommand.call();

You will find in org.eclipse.jgit.test all the example you need:

  • RemoteconfigTest.java uses Config :

     config.setString("remote", "origin", "pushurl", "short:project.git"); config.setString("url", "https://server/repos/", "name", "short:"); RemoteConfig rc = new RemoteConfig(config, "origin"); assertFalse(rc.getPushURIs().isEmpty()); assertEquals("short:project.git", rc.getPushURIs().get(0).toASCIIString());
  • PushCommandTest.java illustrates various push scenario, using RemoteConfig .
    See testTrackingUpdate() for a complete example pushing an tracking a remote branch.
    Extracts:

     String trackingBranch = "refs/remotes/" + remote + "/master"; RefUpdate trackingBranchRefUpdate = db.updateRef(trackingBranch); trackingBranchRefUpdate.setNewObjectId(commit1.getId()); trackingBranchRefUpdate.update(); URIish uri = new URIish(db2.getDirectory().toURI().toURL()); remoteConfig.addURI(uri); remoteConfig.addFetchRefSpec(new RefSpec("+refs/heads/*:refs/remotes/" + remote + "/*")); remoteConfig.update(config); config.save(); RevCommit commit2 = git.commit().setMessage("Commit to push").call(); RefSpec spec = new RefSpec(branch + ":" + branch); Iterable<PushResult> resultIterable = git.push().setRemote(remote) .setRefSpecs(spec).call();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM