如何使用JGit执行等同于“git push --mirror ...”的操作?

3
我想创建一个简单的应用程序,从Java域执行“git push --mirror”操作。
尽管JGit库支持“--all”和“--tags”,但PushCommand类似乎不支持“--mirror”选项。
我错过了什么吗?我们如何使用JGit执行“git push --mirror …”操作?
2个回答

4

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

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

感谢robinst的帮助。 - DavidCastagna

2

--mirror在JGit中还没有完全等效的功能,但您应该能够模拟此行为。要强制推送所有本地引用,可以使用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的局部删除。
这样对您有帮助吗?

第一部分运行良好(感谢您)。但是这个删除引用检测似乎更困难。看起来我需要先克隆一份存储库的副本,然后在克隆中执行LsRemoteCommand(否则没有远程)。所以第二个代码块中的“git”对象是推送连接另一端的git还是我在将其推送到镜像之前必须制作的额外存储库克隆?(注意:我希望从git的主存储文件夹内部运行此应用程序,而不是克隆。) - DavidCastagna
我应该这样做吗?:Git gRemote = new Git(new FileRepository("<<远程路径>>")) ; Collection<Ref> remoteRefs = >>gRemote<<.lsRemote().setHeads(true).setTags(true).call() ; 然后是你给出的其余部分... - DavidCastagna
很抱歉,我不理解“git主存储文件夹”是什么意思。我对你最初的问题的理解是,你有一个克隆的存储库,想要执行push --mirror命令。我已经注释了第二个代码块,希望能澄清事情。 - Rüdiger Herrmann
不,我没有克隆...也不想克隆。我们有一个带有Git的主服务器和镜像服务器,其中包含副本(通过执行“git push --mirror”生成)。如果我想编译删除项目列表,就像您的代码示例中一样,如何在不首先克隆它的情况下计算Git镜像服务器副本中的项目列表?基本上归结为这个问题:调用“<git> .lsRemote()”仅适用于克隆。是否有一种方法可以在不首先克隆git的情况下获取所有头部和标记引用的列表? - DavidCastagna
有一个静态的 Git.lsRemoteRepository() 方法,它将返回一个 LsRemoteCommand,该命令可以在没有(本地)存储库的情况下工作。应该可以用 setRemote 指定远程存储库的 URL 来替换第二个代码块中的 git.lsRemote()。但要注意,静态创建的 LsRemoteCommand 有其限制 - Rüdiger Herrmann
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接