2015-10-16 506 views
2

我正在处理ANT任务,它调用一些使用JGit在git存储库上创建新分支并将其推送到远程的java。我正在使用JGit 2.1.0。JGit创建新的本地分支并推送到远程(分支不存在于远程)

下面的代码:

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变量设置为:真正(既我有这个问题)。

之后有一个单独的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。 任何建议/澄清将有所帮助。

回答

4

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

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

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

setUpstreamMode()即使您即将创建新分支也没有用。当您为远程分支创建本地分支时,它旨在设置跟踪。但是由于您还没有远程分支,因此不需要setUpstreamMode ewither。

创建本地分支后,请使用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的细节。

+0

感谢您的信息和澄清。我认为问题是我试图使用的代码只能用于现有的远程分支。我可以使用一个标志来指示分支不存在于远程,然后使用你的逻辑。 – ptha

+0

很高兴帮助。我发现写下实现目标所需的本机Git命令序列并将它们翻译成JGit API调用有时很有用。 –