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

标签 java git git-branch jgit git-checkout

我正在处理一个 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 存储库的路径(已被克隆)。 branch 变量设置为:release_2_0_2 force 变量设置为:truefalse(我都有这个问题)。

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

当运行上面的代码时,在第二个 catch 中捕获了一个异常:

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

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

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

最佳答案

使用setStartPoint() 来指定新分支应该基于什么。 setStartPoint 指向的提交将是新分支的初始提交。

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

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

如果您要创建一个新分支,

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 推送的更多详细信息。

关于java - JGit 创建新的本地分支并推送到远程(远程上不存在分支),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33168230/

相关文章:

java - 为什么 Comparable 自然排序需要和 equals 方法保持一致?

git - 可以让 git 从外部仓库跟踪单个文件吗?

Git Server Hooks - 它们是在客户端/克隆机器上本地执行的吗?

git - 删除私有(private)服务器(不是 GitHub)上的 git master 分支

Git:提交一个标签,然后将提交 merge 到 master

Java null java.lang.IllegalArgumentException 使用 If-Statement 解析问题

java - 不要传递 <f :param in jsf 的值

java - 如何导航到 IntelliJ 中的类型?或者什么是 Eclipse 的 Ctrl + Shift + T?

git - 获取 Git 提交,进行更改,然后重新提交

git - 为什么管道会从 git log 中删除分支名称?