Bezdepbonusu7Программирование: статьи и ответы

Вопрос

JGit - не удается отследить вновь созданную ветку

Автор вопроса: rhinmassОтветов: 2

Я хотел бы создать ветку в существующем репозитории, а затем отслеживать эту ветку. Создание ветки выполнено успешно, вновь созданная ветка по-прежнему отслеживает master. Я пробовал несколько разных решений, но результат тот же - ветвь создается, но отслеживает master.

Сначала я клонирую репозиторий:

Git.cloneRepository()./*set creds*/.setURI(..).setDirectory(...).call

Все идет нормально.

Затем соберите репозиторий из файла git, созданного клоном.

FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repo = builder.setGitDir(gitFile).readEnvironment().findGitDir()
    .build();

На данный момент я пробовал как проверить ветку с createBranch, установленным в true, так и сделать это в два этапа - создать, а затем проверить. Вот двухэтапный метод:

git.branchCreate()
        .setForce(true)
        .setName(branchName)
        .setStartPoint("origin/master")
        .call();
git.checkout()
        .setName(branchName)
        .setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
        .setStartPoint("origin/"+branchName)
        .call();

Другие вещи, которые я пробовал:

  • установка восходящего режима SeetupUpstreamMode.SET_UPSTREAM
  • установка начальной точки на имя ветки на шаге создания
  • не делать отдельную кассу, а ставить creatBranch(true) при кассе
  • нажатие между созданием и оформлением заказа

Результатом всегда является файл .git/config, который выглядит так:

[remote "origin"]
    url = ssh://..
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true
[branch "newbranch1"]
    remote = origin
    merge = refs/heads/master << TRACKING master, not newbranch1

В ветках, которые я создаю с помощью обычного git (не jgit), файл конфигурации выглядит так:

[remote "origin"]
    url = ssh:...
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true
[branch "newbranch2"]
    remote = origin
    merge = refs/heads/newbranch2 << WANT THIS

Любые мысли о том, как я могу заставить свою новую ветку отслеживать ветку, а не мастер?

Использование jgit-4.6.0.201612231935

  • Итак, вы хотите отследить ветку, которой еще нет на удаленке? Rüdiger Herrmann 25.05.2017
  • Обратите внимание, что Git.cloneRepository() возвращает экземпляр Git, из которого вы можете получить репозиторий через getRepository(), нет необходимости использовать FileRepositoryBuilder. Кроме того, не забудьте закрыть возвращенный экземпляр Git, когда закончите. Rüdiger Herrmann 25.05.2017

git-branchjgit

Ответы

Ответ 1 · рейтинг 1 · Rüdiger Herrmann

Я думаю, что вы не можете отслеживать несуществующую ветку с помощью JGit CreateBranchCommand. setStartPoint() полезен только для указания того, куда должна указывать новая ветвь изначально.

Однако вы можете напрямую управлять конфигурацией репозитория с помощью

StoredConfig config = repository.getConfig();
config.setString( "branch", "newbranch", "remote", "origin" );
config.setString( "branch", "newbranch", "merge", "refs/heads/newbranch" );
config.save();

Это решает вашу проблему?

Ответ 2 · rhinmass

Вот окончательный рабочий код: (спасибо Rüdiger Herrmann)

Git git = Git.cloneRepository...

git.checkout().setCreateBranch(true).setName(branchName).call();

pushCmd.setRemote( "origin" )
  .setRefSpecs( new RefSpec( branchName+":"+branchName )).call();

StoredConfig config = git.getRepository().getConfig();
config.setString( "branch", branchName, "remote", "origin" );
config.setString( "branch", branchName, "merge", "refs/heads/" + branchName );
config.save();

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы