我正在研究一个ANT任务,该任务调用一些使用JGit在git存储库上创建新分支并将其推送到远程的java。我使用的是JGit 2.1.0。
以下是代码:
const
src 变量设置为git repo的路径(已经克隆)。 分支变量设置为: release_2_0_2 force 变量设置为: true 或 false (两者都有此问题)。
之后有一个单独的ANT任务来完成推送。
运行上面的代码时,第二次捕获中会捕获异常:
CreateBranchCommand bcc;
CheckoutCommand checkout;
Git git;
try {
Repository repo = new FileRepositoryBuilder().readEnvironment().findGitDir(src).build();
git = new Git(repo);
bcc = git.branchCreate();
checkout = git.checkout();
} catch (IOException e) {
throw new BuildException("Could not access repository " + src, e);
}
try {
bcc.setName(branch)
.setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM)
.setStartPoint("origin/" + branch)
.setForce(force)
.call();
checkout.setName(branch);
checkout.call();
}
} catch (Exception e) {
throw new BuildException("Could not checkout repository " + src, e);
}
问题似乎是org.eclipse.jgit.api.errors.RefNotFoundException: Ref origin/release_2_0_2 can not be resolved
如果我将其硬编码到" origin / master"有用。新分支已创建。我只是尝试在本地创建一个新分支,然后将其推送到远程。我以https://stackoverflow.com/a/12928374/1860867为例。
也许我误解了CreateBranchCommand应该如何使用,我见过的所有例子都是将起点设置为setStartPoint("origin/" + branch)
。
任何建议/澄清都会有所帮助。
答案 0 :(得分:6)
使用setStartPoint()
指定应该添加新分支的内容。 setStartPoint指向的提交将是新分支的初始提交。
如果未明确指定起点,则默认为HEAD
。有关详细信息,请参阅Git文档:https://git-scm.com/docs/git-branch
因此起点必须存在 - 你所指的远程分支显然不存在。
如果您要创建新分支, setUpstreamMode()
也无用。它旨在为现有远程分支创建本地分支时配置跟踪。但由于您还没有远程分支,因此无需拨打setUpstreamMode
。
创建本地分支后,使用PushCommand
将其发布到远程。
PushCommand pushCommand = git.push();
pushCommand.setRemote( "origin" );
pushCommand.setRefSpecs( new RefSpec( "release_2_0_2:release_2_0_2" ) );
pushCommand.call();
以上几行将release_2_0_2
分支推送到已知的远程origin
(您已克隆的远程{。}}。
帖子How do I do git push with JGit?详细介绍了如何推送JGit。