使用JGit如何在远程仓库中创建git分支而无需检出?

3

我们能否在不检出的情况下使用jgit在git中创建远程分支。例如,我想在远程存储库中从名为bar的分支创建一个名为foo的分支,而无需在本地检出bar分支。

3个回答

4

你无法在不克隆的情况下创建远程分支
你可以在不检出的情况下创建远程分支

具体来说,你可以通过设置“setNoCheckout(true)”选项仅克隆“.git”目录(而非工作目录),然后创建远程分支并推送。

让我们看看我的例子:

// clone repository. Like to 'git clone -n repository'
Git.cloneRepository().setURI(projectURL).setDirectory(repositoryFile)
  .setCredentialsProvider(credentials).setCloneAllBranches(true).setNoCheckout(true)
  .call();

// create branch locally
git.branchCreate().setName(targetBranch).setForce(true)
  .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK).setStartPoint(startPoint)
  .call();

// push created branch to remote repository
// This matches to 'git push targetBranch:targetBranch'
RefSpec refSpec = new RefSpec().setSourceDestination(targetBranch, targetBranch);   
git.push().setRefSpecs(refSpec).setCredentialsProvider(credentials).call();

我使用的是jgit版本3.3.0.201403021825-r,对我来说很好用。


有趣的补充,跳过结账步骤可能会很有意思。+1 - VonC
我正在尝试使用你的代码,但是出现了“无法解析Ref HEAD”错误(我的分支名称为master)。 - Seb

2
您需要在本地仓库中至少有一个名为'bar'的分支,才能将其推送到另一个名称'foo'下。
但您不必首先检出该本地分支'bar'。请参考此JGit推送测试示例
RefSpec spec = new RefSpec("refs/heads/bar:refs/heads/foo");
git1.push().setRemote("test").setRefSpecs(spec).call();

根据你所说的,我必须克隆存储库。我想做的是在不本地克隆的情况下远程创建一个分支。jgit提供这个功能吗? - Buddy
@Buddy,jgit不会提供该功能。Git也不会。其他任何库(libgit2等)也不会。您所描述的仅在您可以访问远程服务器的情况下才可能实现,直接在裸仓库中添加新分支。但是,您只能克隆一个分支。 - VonC
@VovC 好的,明白了。非常感谢。 - Buddy

0

我能够使用rest api curl命令创建远程分支

/rest/branch-utils/1.0/projects/{projectKey}/repos/{repositorySlug}/branches

Rest API和Curl命令


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接