【问题标题】:Fetching all Git branches programmatically with JGit使用 JGit 以编程方式获取所有 Git 分支
【发布时间】:2018-03-31 16:38:13
【问题描述】:

我在一个项目中使用JGit,我想实现git --fetch all 的编程等效项。 JGit API Documentation 提供了三个alternative fetch operations,称为setRefSpecs(...)。所有替代方案都需要开发人员定义具体的RefSpecs 以进行更新。

我希望我必须在存储库中查询所有可用的 RefSpecs 并将它们聚合以进行一次组合的 fetch 调用(类似于 Getting all branches with JGit )。但是,我不明白如何将Ref 转换为RefSpec。我会很感激这里的任何指针。

与此非常相关,我也不确定如何修剪已远程删除的本地分支(fetch --prune)。我是否可以假设将setRemoveDeletedRefs 设置为true 可以实现这一点?

【问题讨论】:

    标签: git api fetch jgit


    【解决方案1】:

    根据 git fetch 文档,--all 将从所有(配置的)远程获取分支。

    JGit 的RemoteListCommand 可用于获取所有已配置遥控器的列表。对于每个遥控器,您都需要获取分支。我假设,refspec fetch 所说的分支是从各自远程的配置中派生的。

    使用 JGit API,这将是

    Git git = ...
    List<RemoteConfig> remotes = git.remoteList().call();
    for(RemoteConfig remote : remotes) {
      git.fetch()
          .setRemote(remote.getName())
          .setRefSpecs(remote.getFetchRefSpecs())
          .call();
    }
    

    当然,您可以使用自己的 refspec,例如 refs/heads/*:refs/remotes/&lt;remote-name&gt;/* 来同步所有分支。

    回答你的第二个问题:是的,FetchCommand::setRemoveDeletedRefs 用于修剪本地分支,相当于--prune

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-01
      • 2019-11-02
      • 2019-03-25
      • 1970-01-01
      • 2012-07-03
      • 2011-06-09
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多