如何使用JGit查看本地工作区的修改?

问题描述 投票:0回答:2

我可以使用JGit查看不同提交或不同分支之间的差异,但我不知道如何将未提交的文件与HEAD进行比较。 我已经搜索了 JGit Cookbook,但仍然没有找到解决方案。

java jgit
2个回答
0
投票

在 Git 中,“本地工作区”被称为工作目录。 JGit 中比较来自不同源(工作目录、索引、提交)的文件的抽象是树迭代器

一旦创建了两个这样的迭代器,您就可以比较它们。要将工作目录与 HEAD 提交进行比较,请使用如下内容:

// Create the HEAD tree iterator
ObjectReader reader = git.getRepository().newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
ObjectId headTree = git.getRepository().resolve( "HEAD^{tree}" );
oldTreeIter.reset( reader, headTree );
// Create the working tree iterator
AbstractTreeIterator newTreeIter = new FileTreeIterator(git.getRepository());

// Either: call the diff command
git.diff()
  .setOldTree(oldTreeIter)
  .setNewTree(newTreeIter)
  .call();
// Or: use the DiffFormatter to list changes
try (DiffFormatter formatter = new DiffFormatter(NullOutputStream.INSTANCE)) {
  formatter.setRepository(git.getRepository());
  List<DiffEntry> entries = formatter.scan(oldTreeIterator, newTreeIterator);
}

JGit 的

DiffCommand
只是将差异打印到标准输出。 或者,
DiffFormatter::scan
可用于返回
DiffEntry
,每个描述文件的更改。

有关 JGit 的 diff API 的更多信息,您可能需要阅读我很久以前写的这篇文章:https://www.codeaffine.com/2016/06/16/jgit-diff/


0
投票
    Git git = Git.open(new File("xxx"));
    Repository repository = git.getRepository();
    DiffFormatter diffFormatter = new DiffFormatter(System.out);
    diffFormatter.setRepository(repository);

    ObjectReader reader = git.getRepository().newObjectReader();
    CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
    ObjectId headTree = git.getRepository().resolve( "HEAD^{tree}" );
    oldTreeIter.reset( reader, headTree );
    AbstractTreeIterator newTreeIter = new FileTreeIterator(git.getRepository());
    diffFormatter.format(oldTreeIter, newTreeIter);
© www.soinside.com 2019 - 2024. All rights reserved.