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

Posted

技术标签:

【中文标题】使用 jgit 创建远程和本地分支【英文标题】:Create remote and local branch with jgit 【发布时间】:2022-01-05 02:44:29 【问题描述】:

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

    git clone git@gitlab.com:my-project/test.git git checkout -b superBranch 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 示例那样发出合并请求?

【问题讨论】:

我认为您需要使用完全限定的参考名称。在你的第一个 sn-p 中,这将是 refs/remotes/origin/superBranch 创建分支和 refs/heads/superBranch:refs/remotes/origin/superBranch 推送。 @RüdigerHerrmann 感谢您的回复。如果我使用完全限定的 ref 名称,那么我会收到相同的异常“RefNotFoundException:无法解析 Ref refs/remotes/origin/superBranch” 看起来 jgit 正在重复 Git 的伎俩,即拒绝您使用远程跟踪名称(在本例中为 refs/remotes/origin/superBranch)直到它真正存在。这并非完全不合理,尽管有一些方法可以绕过它,就像在 Git 中一样。 还值得一提的是,“远程分支”这个短语要么是荒谬的,要么是模棱两可的:它是指superBranch,因为它存在于另一个(远程)Git repo 上,还是指@987654331 @ 因为它存在于您自己的 Git 存储库中?因此,我使用术语 remote-tracking name,这显然意味着您的存储库中的那个。 【参考方案1】:

以下代码对我有用:

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();

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

【讨论】:

以上是关于使用 jgit 创建远程和本地分支的主要内容,如果未能解决你的问题,请参考以下文章

git拉取远程分支并创建本地分支

码云git使用四(分支的创建,使用和合并)

本地分支和远程分支的创建与合并

git基于远程分支创建本地分支

如何从现有的远程分支创建本地分支?

Git branch 和fetch 指令总结:分支查看和远程分支同步