如何使用JGit做等效的“git push --mirror ...”?

时间:2014-08-13 19:29:18

标签: java git jgit

我正在尝试创建一个从Java域执行“git push --mirror”操作的简单应用程序。

JGit库,特别是PushCommand类,似乎不支持“--mirror”选项,即使它支持“--all”和“--tags”。

我错过了什么吗?我们如何使用JGit来执行“git push -mirror ...”?

2 个答案:

答案 0 :(得分:2)

使用以下参考规范手动尝试:

git.push().setRefSpecs(new RefSpec("+refs/*:refs/*")).call();

答案 1 :(得分:1)

在JGit中还没有完全等同于--mirror,但您应该能够模拟此行为。要强制推送所有本地引用,可以使用

配置PushCommand
PushCommand pushCommand = git.push();
pushCommand.setForce( true );
pushCommand.add( "refs/*:refs/*" );

这将留下已在本地删除的引用。因此,您可以获取远程引用列表以确定已在本地删除的内容并将这些删除发布到远程:

Collection<Ref> remoteRefs = git.lsRemote().setRemote( "origin" ).setHeads( true ).setTags( true ).call();
Collection<String> deletedRefs = new ArrayList<String>();
for( Ref remoteRef : remoteRefs ) {
  if( git.getRepository().getRef( remoteRef.getName() ) == null ) {
    deletedRefs.add( remoteRef.getName() );
  }
}
for( String deletedRef : deletedRefs ) {
  pushCommand.add( ":" + deletedRef );
}

git变量引用要从中推送的存储库,即第一个块中的存储库。 LsRemoteCommand返回本地存储库配置中配置为origin的远程存储库中的所有头和标记。在通常的情况下,你克隆的那个。

请注意,删除本地引用的传播方法存在一个小差距。 LsRemoteCommand仅返回headstags下的引用(例如,没有pulls等自定义引用),因此您不会检测到例如refs/foo/bar的本地删除。 {{1}}。

这对你有用吗?