我正在尝试创建一个从Java域执行“git push --mirror”操作的简单应用程序。
JGit库,特别是PushCommand类,似乎不支持“--mirror”选项,即使它支持“--all”和“--tags”。
我错过了什么吗?我们如何使用JGit来执行“git push -mirror ...”?
答案 0 :(得分:2)
使用以下参考规范手动尝试:
git.push().setRefSpecs(new RefSpec("+refs/*:refs/*")).call();
答案 1 :(得分:1)
在JGit中还没有完全等同于--mirror
,但您应该能够模拟此行为。要强制推送所有本地引用,可以使用
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
仅返回heads
和tags
下的引用(例如,没有pulls
等自定义引用),因此您不会检测到例如refs/foo/bar
的本地删除。 {{1}}。
这对你有用吗?