¿Cómo hago git push con JGit?

Intento crear una aplicación Java que permita a los usuarios usar repositorys basados ​​en Git. Pude hacer esto desde la línea de command, usando los siguientes 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 

Esto me permitió crear, agregar y enviar contenido a mi repository local y enviar contenido al repository remoto. Ahora estoy tratando de hacer lo mismo en mi código Java, usando JGit. Pude fácilmente hacer git init, agregar y confirmar usando JGit API.

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

De nuevo, todo esto funciona bien. No pude encontrar ningún ejemplo o código equivalente para git remote add y git push . Miré esta pregunta SO .

testPush() falla con el post de error TransportException: origin not found . En los otros ejemplos que he visto https://gist.github.com/2487157 do git clone antes de git push y no entiendo por qué es necesario.

Cualquier sugerencia sobre cómo puedo hacer esto será apreciada.

Encontrará en org.eclipse.jgit.test todos los ejemplos que necesita:

  • RemoteconfigTest.java usa 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 ilustra varios escenarios de inserción, utilizando RemoteConfig .
    Consulte testTrackingUpdate() para get un ejemplo completo que impulsa un seguimiento de una twig remota.
    Extractos:

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

La forma más fácil es usar la API JGit Porcelain:

  Repository localRepo = new FileRepository(localPath); Git git = new Git(localRepo); // 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.setCnetworkingentialsProvider(new UsernamePasswordCnetworkingentialsProvider("username", "password")); // you can add more settings here if needed pushCommand.call();