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

推荐答案

在Git中,"本地工作区"称为工作目录.在JGit中,比较来自不同来源(工作目录、索引、提交)的文件的抽象为tree iterators.

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

// 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只是将差值打印到stdout. 或者,DiffFormatter::scan可以用来返回DiffEntry,每个DiffEntry描述对文件的改变.

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

Java相关问答推荐

Spring Boot找不到Mapper bean

gitlab ci不会运行我的脚本,因为它需要数据库连接'

如何在Java中声明未使用的变量?

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

JPanel透支重叠的JComcoBox

Spring Data JPA慢慢地创建了太多非活动会话

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

MySQL数据库中未应用具有Spring数据的唯一约束

Jolt变换JSON数组问题

S,要对Java复制构造函数深度克隆所有属性进行单元测试,最可靠的方法是什么?

如何在Cosmos DB(Java SDK)中增加默认响应大小

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

从Spring6中的JPMS模块读取类时出现问题

如果第一位数字和最后一位数字相差超过一位,您将如何获得随机数?

何时调用密封层次 struct 的switch 中的默认情况

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

不能在 map 上移除折线

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

使用Java线程进行并行编程