Точного эквивалента --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
возвращает только ссылки под heads
и tags
(например, никаких пользовательских ссылок, таких как pulls
), поэтому вы не обнаружите локальное удаление, например. refs/foo/bar
.
Это работает для вас?
person
Rüdiger Herrmann
schedule
14.08.2014