Извлечение с помощью JGit не показывает последнюю фиксацию

Я пытаюсь написать простую программу для использования основных функций JGit. Я не хочу использовать инструмент слияния git по умолчанию, но я хотел бы получить, а затем выполнить слияние самостоятельно.

Я использую приведенный ниже код, и у меня возникает странная проблема: когда я вызываю метод обновления сразу после отправки фиксации, FETCH_HEAD не содержит только что отправленную фиксацию (см. вывод). Но после использования «git fetch» ​​в git bash результат выборки содержит последний коммит. Таким образом, кажется, что выборка библиотеки отличается от фактической выборки git.

Я думаю, это связано с тем, как я использую git.fetch(), но я пробовал со многими параметрами FetchCommand и без них, и это ничего не меняет. Может быть, я где-то забыл какое-то обновление... Может ли оно исходить от getFetchCommit()?

ВЫХОД:

> update
Fetch : [email protected]:XXX/XXX.git
Repository C:\XXX\XXX\.git is up to date.
    last commit : commit2 - fcddf71c214784e511ccef73b2c083c0fcacd653

// Making some changes

> update
Fetch : [email protected]:XXX/XXX.git
You have uncommited changes, commit them (y/n)? : y
Added : 
    README.md
message : commit3
Commit : commit3 d50209b080bd0d474b79801bfdc808dd494d83fe
local commit : commit3 - d50209b080bd0d474b79801bfdc808dd494d83fe
fetch commit : commit2 - fcddf71c214784e511ccef73b2c083c0fcacd653
Not up to date, do you wish to : fpush - fpull - merge? : fpush
Push : [email protected]:XXX/XXX.git   // The push appears as excepted on the repo
> update
Fetch : [email protected]:XXX/XXX.git
local commit : commit3 - d50209b080bd0d474b79801bfdc808dd494d83fe
fetch commit : commit2 - fcddf71c214784e511ccef73b2c083c0fcacd653
Not up to date, do you wish to : fpush - fpull - merge? :    // Should to be up to date
>

// git fetch on git bash

> update
Fetch : [email protected]:XXX/XXX.git
Repository C:\XXX\XXX\.git is up to date.
    last commit : commit3 - d50209b080bd0d474b79801bfdc808dd494d83fe

КОД:

public void gitFetch() throws Exception
{
    FetchResult fetch = git.fetch().setRemote("origin").call();
    System.out.println("Fetch : " + fetch.getURI().toString());
}

public void gitPush(boolean force) throws Exception
{
    Iterable<PushResult> push = git.push().setForce(force).call();
    System.out.println("Push : " + push.iterator().next().getURI().toString());
}

public RevCommit getLocalCommit() throws Exception
{
    Iterable<RevCommit> logL = git.log().call();
    return logL.iterator().next();
}

public RevCommit getFetchCommit() throws Exception
{
    gitFetch();
    Iterable<RevCommit> log = git.log().add(git.getRepository().resolve("FETCH_HEAD")).call();
    return log.iterator().next();
}

public void gitUpdate() throws Exception
{
    RevCommit localCommit = getLocalCommit();
    RevCommit fetchCommit = getFetchCommit();

    if (fetchCommit.getId().equals(localCommit.getId()))
    {
        System.out.println("Repository " + localRepo.getDirectory().getAbsolutePath() + " is up to date.");
        printCommit(localCommit, "\tlast");
    }
    else
    {
        printCommit(localCommit, "local");
        printCommit(fetchCommit, "fetch");
        String input = readInput("Not up to date, do you wish to : fpush - fpull - merge?");

        if (input.equals("fpush"))
            gitPush(true);
        else if (input.equals("fpull"))
            gitPull();
        else if (input.equals("merge"))
            // Do my own merge
    }
}

person Zakor    schedule 10.07.2014    source источник
comment
Я не уверен, правильно ли JGit обновляет FETCH_HEAD в случае git fetch origin. Есть ли причина, по которой вы не используете, например. origin/master вместо этого?   -  person robinst    schedule 11.07.2014
comment
Возможно, FETCH_HEAD действительно не обновляется. Я могу использовать только origin/master, это не проблема. Но я не понимаю, как и где я должен выбрать мастер. Все, что я вижу, это функция setRemote для таких команд, как fetch или push. Обратите внимание, что я не могу сделать setRemote("origin/master")   -  person Zakor    schedule 11.07.2014
comment
Я имел в виду замену resolve("FETCH_HEAD") на resolve("origin/master").   -  person robinst    schedule 11.07.2014
comment
Вы можете указать refspec для FetchCommand, например. fetch.setRefSpec( new RefSpec( "refs/heads/master:refs/remotes/origin/master" ) ), чтобы ограничить ветки, для которых извлекаются изменения. По завершении FetCommand#call() возвращает FetchResult, в котором перечислены переданные идентификаторы коммитов (если они есть).   -  person Rüdiger Herrmann    schedule 11.07.2014


Ответы (1)


Вау, это сработало с resolve("origin/master") ! Спасибо, робинст. На самом деле друг также нашел другой ответ, когда вы ответили, заменив getFetchCommit() новым gitFetch()

public RevCommit gitFetch() throws Exception
{
    FetchResult result = git.fetch().setRemote("origin").call();
    System.out.println("Fetch : " + result.getURI().toString());
    return revWalk.parseCommit(result.getAdvertisedRef("refs/heads/" + localRepo.getBranch()).getTarget().getObjectId());
}

Но ваше решение, робинст, кажется более ясным, поэтому я его принимаю!

person Zakor    schedule 11.07.2014