Выборка с JGit не показывает последний коммит

1

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

Я использую код ниже, и у меня возникла странная проблема, когда я вызываю метод обновления сразу после нажатия фиксации, FETCH_HEAD не содержит commit, который я просто нажал (см. Вывод). Но после использования "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
    }
}
  • 0
    Я не уверен, что JGit правильно обновляет FETCH_HEAD в случае возникновения git fetch origin . Есть ли причина, по которой вы не используете, например, origin/master ?
  • 0
    Возможно, FETCH_HEAD не обновляется. Я могу использовать только origin / master, это не проблема. Но я не понимаю, как и где я должен «выбрать» мастера. Все, что я вижу, это функция setRemote для таких команд, как fetch или push. Обратите внимание, что я не могу сделать setRemote("origin/master")
Показать ещё 2 комментария
Теги:
fetch
jgit

1 ответ

0
Лучший ответ

Ничего себе он работал с 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());
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню