Эквивалент git diff в JGit

Как я могу получить результат для git diff a.txt b.txt для файлов a.txt и b.txt, которые не являются частью репозитория?

Мне нужен вывод в формате, который предоставляет git diff. Кроме того, я не могу запускать команды git через Java из-за некоторых ограничений.


person psychorama    schedule 09.07.2015    source источник
comment
Можете ли вы предоставить больше информации о настройке? git diff основан на программе unix diff, которая очень хорошо подходит для требования сравнения двух файлов, не находящихся в репозитории. Наверное, это будет вариант?   -  person Jo Oko    schedule 09.07.2015
comment
Машина, на которой я работаю, я не могу запускать на ней команды git, однако, если у jgit есть способ добиться этого, это будет возможно для меня.   -  person psychorama    schedule 09.07.2015
comment
Я вижу, вы новичок в SO. Если вы считаете, что ответ решил проблему, отметьте его как «принятый», нажав зеленую галочку. Это помогает сосредоточить внимание на старых сообщениях, на которые до сих пор нет ответов.   -  person Rüdiger Herrmann    schedule 13.07.2015


Ответы (1)


Код различий JGit находится в DiffFormatter и связанных с ним классах. Если вы присмотритесь, то увидите, что код не предназначен для сравнения произвольных потоков байтов. Он связан с существующим репозиторием с коммитами, деревьями и т. д.

Если вы не возражаете против неправильных имен файлов, вы можете использовать этот обходной путь:

1) создать временный репозиторий

2) создать коммит с одним файлом (с именем ab.txt), который содержит содержимое a.txt

3) создайте еще один коммит с одним файлом, названным так же, как файл выше, который содержит содержимое b.txt

4) теперь вы можете использовать JGit для сравнения двух коммитов

Пример кода:

File file = new File( git.getRepository().getWorkTree(), "ab.txt" );
writeFile( file, "line1\n" );
RevCommit oldCommit = commitChanges();
writeFile( file, "line1\nline2\n" );
RevCommit newCommit = commitChanges();

ObjectReader reader = git.getRepository().newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
oldTreeIter.reset( reader, oldCommit.getTree() );
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
newTreeIter.reset( reader, newCommit.getTree() );

DiffFormatter diffFormatter = new DiffFormatter( System.out );
diffFormatter.setRepository( git.getRepository() );
List<DiffEntry> entries = diffFormatter.scan( newTreeIter, oldTreeIter );
diffFormatter.format( entries );
diffFormatter.close();

private RevCommit commitChanges() throws GitAPIException {
  git.add().addFilepattern( "." ).call();
  return git.commit().setMessage( "commit message" ).call();
}

private static void writeFile( File file, String content ) throws IOException {
  FileOutputStream outputStream = new FileOutputStream( file );
  outputStream.write( content.getBytes( "UTF-8" ) );
  outputStream.close();
}
person Rüdiger Herrmann    schedule 11.07.2015