使用JGit获取不会显示最后一次提交

时间:2014-07-10 16:59:07

标签: java git fetch jgit

我试图编写一个简单的程序来使用JGit的基本功能。我不想使用默认的git合并工具,但我想获取然后自己进行合并。

我使用下面的代码并且我遇到了一个奇怪的问题,当我在推送提交后立即调用update方法时,FETCH_HEAD不包含我刚刚推送的提交(请参阅输出)。但在使用" git fetch"在git bash中,获取结果包含最后一次提交。所以看起来库的获取与实际的git fetch不同。

我认为它来自我使用 git.fetch()的方式,但我尝试使用和不使用FetchCommand的许多选项,但它并没有改变一切。也许我已经在某个地方忘记了某种更新......它可能来自 getFetchCommit()吗?

输出:

> update
Fetch : git@github.com:XXX/XXX.git
Repository C:\XXX\XXX\.git is up to date.
    last commit : commit2 - fcddf71c214784e511ccef73b2c083c0fcacd653

// Making some changes

> update
Fetch : git@github.com: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 : git@github.com:XXX/XXX.git   // The push appears as excepted on the repo
> update
Fetch : git@github.com: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 : git@github.com:XXX/XXX.git
Repository C:\XXX\XXX\.git is up to date.
    last commit : commit3 - d50209b080bd0d474b79801bfdc808dd494d83fe

CODE:

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
    }
}

1 个答案:

答案 0 :(得分:0)

哇它与resolve("origin/master")合作!谢谢robinst。 实际上,当你回答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似乎更清晰,所以我会接受它!