使用 jgit 创建远程和本地分支

Create remote and local branch with jgit

我正在尝试使用 jgit 创建一个远程分支,它完全执行以下 git 命令:

  1. git 克隆 git@gitlab.com:my-project/test.git
  2. git checkout -b superBranch
  3. git push --set-upstream origin superBranch

执行完这些后,我可以在没有合并请求的情况下更改和推送分支的文件。

jGit:

不幸的是 jgit 不知道命令“push -u”(上游)。所以我找到了一些可能的解决方案。但并非所有解决方案都有效。

第一名:

// git clone done, than:
git.branchCreate()
   .setName("superBranch")
   .setForce(true)
   .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
   .setStartPoint("origin/superBranch").call(); // <-- Ref not found
RefSpec refSpec = new RefSpec().setSourceDestination("superBranch", "superBranch");
git.push()
   .setRefSpecs(refSpec)
   .setCredentialsProvider(provider).call();
git.checkout().setName("superBranch").call();

异常:

org.eclipse.jgit.api.errors.RefNotFoundException: Ref origin/superBranch cannot be resolved

我在这里找到的另一个解决方案 Eclipse Forum:

git.branchCreate().setName("superBranch").call();
git.push()
   .setRemote("origin")
   .setRefSpecs(new RefSpec("superBranch" + ":" + "superBranch")) //<-- Ref not found
   .setCredentialsProvider(provider).call();
git.branchCreate()
   .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM)
   .setStartPoint("origin/" + "superBranch")
   .setForce(true).call();
git.checkout().setName("superBranch").call();

异常:

org.eclipse.jgit.api.errors.InvalidRefNameException: Branch name <null> is not allowed

有谁知道如何创建远程和本地分支,而不调用 api 或像我在顶部的 git 示例那样发出合并请求?

以下代码适用于我:

Git git = Git.cloneRepository()
             .setURI("https://gitlab.com/my-project/test.git")
             .setDirectory(new File("scratch/test"))
             .setCloneAllBranches(true)
             .setCredentialsProvider(provider).call();
git.checkout()
   .setCreateBranch(true)
   .setName(BRANCH).call();
git.push()
   .setRemote("origin")
   .setRefSpecs(new RefSpec(BRANCH + ":" + BRANCH))
   .setCredentialsProvider(provider).call();

所以我克隆存储库,签出分支或创建分支(如果不存在),然后将新分支推送到远程存储库。

最后,我试了这个,对我有用。

git.branchCreate().setName(localBranchName).call();
git.push().setRemote("origin")
          .setCredentialsProvider(createCredential(name, password))
          .setRefSpecs(new RefSpec(localBranchName + ":" + localBranchName)).call();
//delete is necessary        
git.branchDelete().setBranchNames(localBranchName).call();
git.checkout().setCreateBranch(true).setName(localBranchName)
              .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
              .setStartPoint("origin/" + localBranchName)
              .call();