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

问题描述 投票:5回答:1

我正在执行一个ANT任务,该任务会调用一些使用JGit的Java在git存储库上创建一个新分支并将其推送到远程。我正在使用JGit 2.1.0。

这里是代码:

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

src变量设置为git repo的路径(已被克隆)。branch变量设置为:release_2_0_2force变量设置为:truefalse(我都遇到了这个问题)。

之后会有一个单独的ANT任务来进行推送。

运行上述代码时,第二个捕获中捕获了一个异常:

org.eclipse.jgit.api.errors.RefNotFoundException: Ref origin/release_2_0_2 can not be resolved

问题似乎出在setStartPoint("origin/" + branch),如果我将其硬编码为“起源/母版”,则它可以工作。创建新分支。我只是想在本地创建一个新分支,然后将其推送到远程。我以https://stackoverflow.com/a/12928374/1860867为例。

也许我误解了应该如何使用CreateBranchCommand,我所看到的所有示例都将起点设置为"origin/" + branch。任何建议/说明都将有所帮助。

java git git-branch jgit git-checkout
1个回答
9
投票

使用setStartPoint()指定应基于哪个新分支。 setStartPoint指向的提交将是新分支的初始提交。

如果未明确指定起点,则默认为HEAD。请参阅Git文档以获取更多详细信息:https://git-scm.com/docs/git-branch

因此起点必须存在-您所指的远程分支显然不存在。

setUpstreamMode()也无用,如果要创建一个新分支。它是在为现有远程分支创建本地分支时配置tracking。但是,由于您还没有远程分支,因此无需调用setUpstreamMode

一旦创建了本地分支,请使用PushCommand将其发布到远程。

git.push()
    .setRemote("origin")
    .setRefSpecs(new RefSpec("release_2_0_2:release_2_0_2"))
    .call();

以上行将release_2_0_2分支推送到已知的远程origin(您从中克隆的那个)。

帖子How do I do git push with JGit?上有关于如何使用JGit进行推送的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.