JGit: Оформить заказ на удаленную ветку

Я использую JGit для проверки удаленной ветви отслеживания.

Git binrepository = cloneCmd.call()

CheckoutCommand checkoutCmd = binrepository.checkout();
checkoutCmd.setName( "origin/" + branchName);
checkoutCmd.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK );
checkoutCmd.setStartPoint( "origin/" + branchName );

Ref ref = checkoutCmd.call();

Файлы извлечены, но HEAD не указывает на ветку. Ниже приводитсяgit status выход,

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

Эту же операцию можно легко выполнить в командной строке git, и она работает,

git checkout -t origin/mybranch

Как это сделать JGit?

Ответы на вопрос(4)

Вы также можете просто так

git.checkout().setName(remoteBranch).setForce(true).call();
                logger.info("Checkout to remote branch:" + remoteBranch);
                git.branchCreate() 
                   .setName(branchName)
                   .setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM)
                   .setStartPoint(remoteBranch)
                   .setForce(true)
                   .call(); 
                logger.info("create new locale branch:" + branchName + "set_upstream with:" + remoteBranch);
                git.checkout().setName(branchName).setForce(true).call();
                logger.info("Checkout to locale branch:" + branchName);
Решение Вопроса

Вы должны использоватьsetCreateBranch создать ветку:

Ref ref = git.checkout().
        setCreateBranch(true).
        setName("branchName").
        setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK).
        setStartPoint("origin/" + branchName).
        call();

Ваша первая команда была эквивалентомgit checkout origin/mybranch.

(Изменить: я отправил патч в JGit для улучшения документации CheckoutCommand:https://git.eclipse.org/r/8259)

 Nambi18 окт. 2012 г., 00:26
Я попробовал это. оно работает. это простое решение. Мне нужно внести изменения, зафиксировать и нажать на удаленный. Я проверю это и обновлю тему.
 Adam Siemion24 сент. 2014 г., 08:59
@robinst Чтобы заставить его работать с именем git-тега,origin/ должен быть удален, в противном случаеэто случится.
 Adam Siemion23 сент. 2014 г., 23:14
Приведенный выше код не будет работать с тегами Git, права?
 robinst24 сент. 2014 г., 03:44
@AdamSiemion: Что ты имеешь в виду под этим?setStartPoint должен работать с именем тега, иначе это ошибка в JGit (пожалуйста, сообщите об этом).
 VonC18 окт. 2012 г., 07:26
Гораздо более полный ответ, чем мой. +1

CheckoutCommand, вам нужно установить логическое значениеcreateBranch вtrue для того, чтобы создать местный филиал.

Вы можете увидеть пример вCheckoutCommandTest - testCreateBranchOnCheckout()

@Test
public void testCreateBranchOnCheckout() throws Exception {
  git.checkout().setCreateBranch(true).setName("test2").call();
  assertNotNull(db.getRef("test2"));
}
 robinst19 окт. 2012 г., 13:31
Хорошая идея, чтобы дать ссылку на тестовые случаи, +1 :)

который разместил robinst, не работал для меня. В частности, созданная локальная ветвь не отслеживала удаленную ветвь. Вот что я использовал, который работал для меня (используя jgit 2.0.0.201206130900-r):

git.pull().setCredentialsProvider(user).call()
git.branchCreate().setForce(true).setName(branch).setStartPoint("origin/" + branch).call();
git.checkout().setName(branch).call()
 PC.06 апр. 2017 г., 14:17
Это должен быть принят ответ. Другие два решения не работают.

Ваш ответ на вопрос