Как принудительно обновить данную ветку метаданных удаленных и заголовков, используя JGIT? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть приложение, которое не полностью поддерживает git.Требование заключается в том, что удаленный репозиторий всегда является единственным источником правды, поэтому

  1. Коммиты всегда отправляются сразу
  2. Выборка выполняется перед любым взаимодействием для обновления состояния локального репозитория

Вот так я получаю данную ветку по запросу

private void fetchBranch(String branch) throws GitAPIException {
        RefSpec ref = new RefSpec().setSourceDestination(Constants.R_HEADS + branch, Constants.R_REMOTES + Constants.DEFAULT_REMOTE_NAME + "/" + branch)
                .setForceUpdate(true);
        RefSpec ref2 = new RefSpec().setSourceDestination(Constants.R_HEADS + branch, Constants.R_HEADS + branch)
                .setForceUpdate(true);
        git.fetch()
                .setRemote(Constants.DEFAULT_REMOTE_NAME)
                .setRefSpecs(ref2,ref)
                .setCredentialsProvider(credentials.orElse(null))
                .setProgressMonitor(new FetchProgressMonitor(log, configuration))
                .setForceUpdate(true)
                .call();

//        git.branchCreate()
//                .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM)
//                .setName(branch)
//                .setStartPoint(Constants.DEFAULT_REMOTE_NAME + "/" + branch)
//                .setForce(true)
//                .call();
}

Здесь я намерен явно (локально) обновить удаленный заголовок и локальный заголовок до состояния, которое находится в удаленном хранилище.

Однако, обновляется только первая ссылка в setRefSpecs

Мое намерение здесь ясно, обновите 2 ссылки (remotes / origin / branchName и заголовки / branchName) однимзначение (remotes / origin / branchName) со значением.Я проверил код JGit и вижу, что есть какая-то проверка, которая пропускает ссылки на основе ссылки на источник (поэтому первый аргумент обрабатывается, а второй нет).

Как это сделать правильно, используя fetch команда?Неужели мне действительно нужно сделать branchChreate с setForce(true), чтобы обновить название заголовка / филиала?

Было бы удобно иметь несколько пунктов назначения RefSpec, но их не существует.

1 Ответ

0 голосов
/ 05 июля 2019

FetchCommand никогда не изменит ни одного из ваших местных филиалов (например, refs/heads/foo). Он будет обновлять только удаленные ветви отслеживания, такие как refs/remotes/origin/foo).

Обычная процедура - извлечь изменения в удаленную ветвь отслеживания, а затем объединить или перебазировать или сбросить локальную ветвь и удаленную ветвь отслеживания.

Если вы хотите переопределить локальные изменения при извлечении, вам следует жестко переустановить локальную ветку в ветку удаленного отслеживания с помощью ResetCommand.

Предполагая, что HEAD указывает на refs/heads/foo, т. Е. Foo извлечен, вы можете использовать этот код для сброса ветки в ее удаленную ветвь привязки:

git.reset().setRef("refs/remotes/origin/foo").setMode(ResetType.HARD).call();

Если ветвь, которая должна быть сброшена, не проверена, вы можете просто использовать RefUpdate, например:

ObjectId remoteCommitId = repository.resolve("refs/remotes/origin/foo");
repository.updateRef("refs/heads/foo").setNewObjectId(remoteCommitId).forceUpdate();

Обратите внимание, однако, что в обоих случаях вы потеряете все изменения в локальной ветке.

...