Как мне сделать эквивалент git diff --name-status с jgit?

Я хочу получить список измененных/добавленных/удаленных файлов между ревизией XXXXXX и HEAD. Это то, что у меня есть до сих пор:

String oldHash = "a97e5553e37a25bd1a3c99eab303145baed08dbd";
Git git = Git.open(new File("/tmp/jgit"));
Repository repository = git.getRepository();
ObjectId old = repository.resolve(oldHash);
ObjectId head = repository.resolve("HEAD");

// how do i get the trees from the obj. id?
List<<DiffEntry> diffs = git.diff().setNewTree(null).setOldTree(null).call();

for(DiffEntry diff : diffs) {
    // do stuff
}

Это правильный способ сделать это, и если да, то как мне получить деревья, необходимые для git.diff()?


person Erik    schedule 15.12.2011    source источник
comment
Это отличный вопрос, даже несмотря на то, что ОП конкретно спрашивал только о --name-status, потому что он применяется ко всем вопросам типа jgit.Git.diff(), для которых примеров IMHO мало, а документация по API наклонна. Так что спасибо! И спасибо за ответы @Kevin Sawicki и @ктосо тоже!   -  person Mark Mikofski    schedule 09.05.2013


Ответы (1)


Вы можете получить идентификатор дерева для HEAD и хэш, позвонив:

ObjectId head = repository.resolve("HEAD^{tree}");

и для идентификатора версии:

ObjectId old = repository.resolve(oldHash + "^{tree}");

Когда у вас есть идентификаторы дерева, вы можете создать итераторы дерева и получить различия:

ObjectReader reader = repository.newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
oldTreeIter.reset(reader, oldId);
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
newTreeIter.reset(reader, headId);
List<DiffEntry> diffs= git.diff()
                        .setNewTree(newTreeIter)
                        .setOldTree(oldTreeIter)
                        .call();
person Kevin Sawicki    schedule 19.12.2011
comment
Спасибо! Я попробую сегодня вечером. - person Erik; 20.12.2011
comment
Работал отлично. Спасибо еще раз! - person Erik; 22.12.2011
comment
Я также нашел тесты для DiffCommand действительно полезными при реализации вещей, связанных с различиями, поэтому я решил поделиться ссылкой :-) git.eclipse.org/c/jgit/jgit.git/tree/org .eclipse.jgit.test/tst/ - person Konrad 'ktoso' Malawski; 30.09.2012