【问题标题】:How to remove remote branch with JGit如何使用 JGit 删除远程分支
【发布时间】:2012-08-07 05:31:54
【问题描述】:

我不知道如何删除远程分支。

我试图模仿以下 GIT 命令: git push origin :branchToDelete

以下代码及其与空源的变体:

RefSpec refSpec = new RefSpec();
refSpec = refSpec.setSource("");
// remove branch from origin:
git.push().setRefSpecs(refSpec).add(branchToDelete).call();

抛出和异常,如:

org.eclipse.jgit.api.errors.JGitInternalException: Exception caught during execution of push command
    at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:175)
    at org.gitscripts.DeleteBranchOperation.execute(DeleteBranchOperation.java:27)
    at org.gitscripts.Main.main(Main.java:27)
Caused by: java.io.IOException: Source ref  doesnt resolve to any object.
    at org.eclipse.jgit.transport.RemoteRefUpdate.<init>(RemoteRefUpdate.java:285)
    at org.eclipse.jgit.transport.RemoteRefUpdate.<init>(RemoteRefUpdate.java:189)
    at org.eclipse.jgit.transport.Transport.findRemoteRefUpdatesFor(Transport.java:612)
    at org.eclipse.jgit.transport.Transport.findRemoteRefUpdatesFor(Transport.java:1150)
    at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:149)
    ... 2 more

提前感谢您的想法和解决方案。

【问题讨论】:

  • 从您的错误来看,您的 refSpec 似乎有问题。你确定它是正确的?

标签: java git jgit remote-branch


【解决方案1】:

这应该可以帮助你:

//delete branch 'branchToDelete' locally
git.branchDelete().setBranchNames('refs/heads/branchToDelete').call();

//delete branch 'branchToDelete' on remote 'origin'
RefSpec refSpec = new RefSpec()
        .setSource(null)
        .setDestination("refs/heads/branchToDelete");
git.push().setRefSpecs(refSpec).setRemote("origin").call();

用 jgit 2.0.0.201206130900-r 测试

【讨论】:

    【解决方案2】:

    按照常规的 git 语法,你的 RefSpec() 不应该是::branchToDelete吗?

    【讨论】:

    • 是的,使用new RefSpec(":branchToDelete")new RefSpec().setSource("").setDestination("branchToDelete")
    • @Vince 不,如果源为空,则表示应在远程删除目标分支。 (这就是问题所在。)
    【解决方案3】:

    我从来没有这样做过,但您是否只是通过指定origin/branchToDelete 来尝试DeleteBranchCommand

    编辑:我的意思是 Git/JGit 通过结构 &lt;remote name&gt;/&lt;branch name&gt; 引用远程分支(并且使用 ListBranchCommand 将帮助您确保拼写正确)。

    要知道分支名称的准确拼写,您可以使用ListBranchCommand(不要忘记拨打setListMode(REMOTE))。

    注意:Git 允许比 JGit 更奇怪的行为,所以除非它被写在某个地方,否则不要指望它们。

    编辑:我的意思是 refspec 应该具有以下语法:&lt;remote branch&gt;:&lt;local branch&gt;(或者可能相反),但不要指望它在 JGit 中起作用,如果你错过了一端,即使它适用于吉特。

    【讨论】:

    • OP 不想只在本地删除远程跟踪分支,而是推送分支删除。
    • 是的,我明白了。我的意思是您可以显示远程分支(与跟踪它的本地分支不同),然后删除远程分支。顺便说一句,一个 refspec 被用来指定本地跟踪分支和远程分支之间的链接。我编辑了我的答案以便更好地理解
    • 太棒了!将origin/branchToDelete(或者更准确地说,refs/remotes/origin/branchToDelete)传递给DeleteBranchCommand 有效。使用 JGit 的关键:不要试图模仿 GIT 命令
    • 好吧,@Vince,在运行以下代码 git.branchDelete().setBranchNames("refs/remotes/origin/" + branchToDelete).setForce(true).call(); 后,git branch -a 不包含 branchToDelete 的条目这就是为什么我认为一切正常。但是当我运行git pull 时,我很惊讶地看到* [new branch] test1 -&gt; origin/test1,并且在GitHub 上仍然显示该分支。所以看起来 DeleteBranch 命令只删除了对分支的本地引用,但不影响远程分支本身。我又卡住了……
    • 您可以在删除分支后尝试运行 git push。我的意思是,Git 是一个两步工具,您首先使用它在本地记录您的更改,然后再记录到远程存储库。所以我认为你应该删除跟踪分支或远程分支然后推送。
    【解决方案4】:

    我可以让它工作:

    StoredConfig config = git.getRepository().getConfig();
    config.unsetSection("remote", "origin");
    try {
        config.save();
    } catch (IOException e) {
        logger.error(e.getMessage());
    }
    

    希望对你有帮助。

    【讨论】:

    • 他想删除远程上的一个分支,而不是本地配置的远程。
    猜你喜欢
    • 2016-02-01
    • 2013-07-06
    • 2022-01-05
    • 2016-07-08
    • 1970-01-01
    • 2014-07-26
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多