本文介绍了JGit创建新的本地分支并推送到远程(远程上不存在分支)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理一个ant任务,该任务调用一些使用JGit在Git存储库上创建新分支并将其推送到Remote的Java。我正在使用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存储库(已克隆)的路径。
分支变量设置为:Release_2_0_2
force变量设置为: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
任何建议/澄清都会有所帮助。

推荐答案

使用setStartPoint()指定新分支应基于什么。setStartPoint点将成为新分支的初始提交的提交。

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

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

setUpstreamMode()如果您要创建新分支,setUpstreamMode()也没有用。用于在为现有远程分支创建本地分支时配置跟踪。但由于您还没有远程分支,因此不需要调用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推送的更多详细信息。

这篇关于JGit创建新的本地分支并推送到远程(远程上不存在分支)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。