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

Я хотел бы создать ветку в существующем репозитории, а затем отслеживать эту ветку. Создание ветки выполнено успешно, вновь созданная ветка по-прежнему отслеживает 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


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


Ответы (2)


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

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

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

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

person Rüdiger Herrmann    schedule 25.05.2017

Вот окончательный рабочий код: (спасибо 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();
person rhinmass    schedule 25.05.2017