使用JGit以编程方式获取所有Git分支

时间:2018-03-31 16:38:14

标签: git api fetch jgit

我在项目中使用JGit,我希望实现与git --fetch all的程序化等效。 JGit API Documentation提供了三个名为setRefSpecs(...)的{​​{3}}。所有替代方案都要求开发人员定义要更新的具体RefSpecs

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

与此非常相关,我也不确定如何修剪已远程删除的本地分支(fetch --prune)。我是否正确地认为将setRemoveDeletedRefs设置为true可以达到此目的?

1 个答案:

答案 0 :(得分:1)

根据git fetch文档,--all将从所有(已配置的)遥控器中获取分支。

JGit的RemoteListCommand可用于获取所有已配置的遥控器的列表。在每个遥控器之前,您需要获取分支。我假设,refspec提取表示分支是从相应的远程配置派生的。

使用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/<remote-name>/*来同步所有分支。

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