在本文中,我将深入探讨如何通过JGit进行修订和创建补丁的细节。 从高级DiffCommand一直到功能更广泛的API,以查找文件中的特定更改。
DiffCommand,带我
diff命令可用于比较两个修订并报告更改,添加或删除的文件。 因此,在这种情况下,修订既可以是提交,也可以是工作目录或索引。
在JGit中创建差异的简单形式如下:
git.diff().setOutputStream( System.out ).call();
如果在调用时未指定要比较的修订版本,则会确定工作目录和索引之间的差异。
该命令将diff的文本表示形式打印到指定的输出流:
diff --git a/file.txt b/file.txt
index 19def74..d5fcacb 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,2 @@
existing line
+added line
\ No newline at end of file
另外,call()方法还返回DiffEntries的列表。 这些数据结构描述了添加,删除和更改的文件,还可以用于确定特定文件中的更改。
但是如何比较两个任意修订版本? 通过仔细查看DiffCommand,可以发现它实际上是比较两棵树而不是修订版。 这就解释了为什么工作目录和索引(它们本身是树)也可以比较而无需付出额外的努力。
因此,diff命令期望类型为AbstractTreeIterator的参数指定要比较的旧树和新树。 有时,旧的和新的也称为源和目的地,或简称为a和b。 要了解有关Git中的树的更多信息,您可能需要阅读JGit API的Explore Git Internals 。
树迭代器
但是如何掌握特定的树迭代器呢? 查看AbstractTreeIterator的类型层次结构,可以发现存在三种感兴趣的实现。
FileTreeIterator可用于访问存储库的工作目录。 这样将存储库传递给其构造函数,就可以使用了。
AbstractTreeIterator treeIterator = new FileTreeIterator( git.getRepository() );
DirCacheIterator揭示目录高速缓存(也称为索引)的内容,并且可以通过与FileTreeIterator相似的方式创建。 给定一个存储库,我们可以告诉它读取索引并将该实例传递给DirCacheIterator,如下所示:
AbstractTreeIterator treeIterator = new DirCacheIterator( git.getRepository().readDirCache() );
但是,最有趣的可能