如何使用 JGit 进行 git push?

Posted

技术标签:

【中文标题】如何使用 JGit 进行 git push?【英文标题】:How do I do git push with JGit? 【发布时间】:2012-11-06 23:08:22 【问题描述】:

我正在尝试构建一个允许用户使用基于 Git 的存储库的 Java 应用程序。我可以使用以下命令从命令行执行此操作:

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

这使我可以创建、添加内容并将其提交到本地存储库,并将内容推送到远程存储库。 我现在正在尝试使用 JGit 在我的 Java 代码中做同样的事情。我能够使用 JGit API 轻松地进行 git init、添加和提交。

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

同样,所有这些都可以正常工作。我找不到git remote addgit push 的任何示例或等效代码。我确实看过这个SO question。

testPush() 失败并显示错误消息 TransportException: origin not found。在其他示例中,我见过 https://gist.github.com/2487157 做 git clone 之前 git push,我不明白为什么这是必要的。

任何关于我如何做到这一点的指针将不胜感激。

【问题讨论】:

【参考方案1】:

最简单的方法是使用 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();

【讨论】:

我(5 岁)答案的不错选择。 +1 setName("origin") 到底在做什么? 为添加的新远程存储库设置名称,类似于从终端调用 git remote add [name] [uri] 时传递名称。 我如何将这样的代码推送到特定的分支? 这对我不起作用。我得到org.eclipse.jgit.errors.NoRemoteRepositoryException:。我首先创建了存储库,然后运行我的 java 代码来上传文件。它不工作【参考方案2】:

您将在org.eclipse.jgit.test 中找到您需要的所有示例:

RemoteconfigTest.java 使用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 说明各种推送场景,using RemoteConfig。 请参阅 testTrackingUpdate() 以了解推送 an 跟踪远程分支的完整示例。 摘录:

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

【讨论】:

感谢您的意见。我确实看过 PushCommandTest.java 但对使用它的理解不够。我会尝试一下并提供更新。再次感谢。 现在试了一下,效果很好!非常感谢您的帮助!

以上是关于如何使用 JGit 进行 git push?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JGit 获取提交的文件列表

如何在 JGit 中从一个 git 分支硬重置到另一个分支?

如何使用 JGit 找到提交的分支?

如何使 Tools->Git->Push 在 Qt Creator 中工作

在 Eclipse git 中使用本机 git 而不是 jgit?

如何在 JGit 中重命名文件