JGit:签出一个远程分支

时间:2012-10-17 04:32:47

标签: git jgit

我正在使用JGit结帐远程跟踪分支。

Git binrepository = cloneCmd.call()

CheckoutCommand checkoutCmd = binrepository.checkout();
checkoutCmd.setName( "origin/" + branchName);
checkoutCmd.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK );
checkoutCmd.setStartPoint( "origin/" + branchName );

Ref ref = checkoutCmd.call();

文件已签出,但HEAD未指向分支。 以下是git status输出

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

可以在git命令行中轻松执行相同的操作,并且可以正常工作,

git checkout -t origin/mybranch

如何做到这一点JGit?

4 个答案:

答案 0 :(得分:31)

您必须使用setCreateBranch来创建分支:

Ref ref = git.checkout().
        setCreateBranch(true).
        setName("branchName").
        setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK).
        setStartPoint("origin/" + branchName).
        call();

您的第一个命令相当于git checkout origin/mybranch

(编辑:我向JGit提交了一个补丁,以改进CheckoutCommand的文档:https://git.eclipse.org/r/8259

答案 1 :(得分:4)

CheckoutCommand的代码所示,您需要将布尔createBranch设置为true才能创建本地分支。

您可以在CheckoutCommandTest - testCreateBranchOnCheckout()

中查看示例
@Test
public void testCreateBranchOnCheckout() throws Exception {
  git.checkout().setCreateBranch(true).setName("test2").call();
  assertNotNull(db.getRef("test2"));
}

答案 2 :(得分:4)

无论出于何种原因,robinst发布的代码对我不起作用。特别是,创建的本地分支未跟踪远程分支。这是我使用的对我有用(使用jgit 2.0.0.201206130900-r):

git.pull().setCredentialsProvider(user).call();
git.branchCreate().setForce(true).setName(branch).setStartPoint("origin/" + branch).call();
git.checkout().setName(branch).call();

答案 3 :(得分:1)

你也可以这样

git.checkout().setName(remoteBranch).setForce(true).call();
                logger.info("Checkout to remote branch:" + remoteBranch);
                git.branchCreate() 
                   .setName(branchName)
                   .setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM)
                   .setStartPoint(remoteBranch)
                   .setForce(true)
                   .call(); 
                logger.info("create new locale branch:" + branchName + "set_upstream with:" + remoteBranch);
                git.checkout().setName(branchName).setForce(true).call();
                logger.info("Checkout to locale branch:" + branchName);