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