我试图编写一个简单的程序来使用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
}
}
答案 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似乎更清晰,所以我会接受它!