JGit创建新的本地分支并推送到远程(远程上不存在分支)

时间:2015-10-16 10:28:32

标签: java git git-branch jgit git-checkout

我正在研究一个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)。 任何建议/澄清都会有所帮助。

1 个答案:

答案 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。