我正在尝试使用JGit来获取从上次提交到最近未提交的更改的文件差异。我该如何使用JGit?(使用命令行将是的输出git diff HEAD)
经过几次讨论(link1,link2),我附带了一段代码,该代码可以查找未提交的文件,但无法获取文件的区别
Repository db = new FileRepository("/path/to/git");
Git git = new Git(db);
AbstractTreeIterator oldTreeParser = this.prepareTreeParser(db, Constants.HEAD);
List<DiffEntry> diff = git.diff().setOldTree(oldTreeParser).call();
for (DiffEntry entry : diff) {
System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
DiffFormatter formatter = new DiffFormatter(System.out);
formatter.setRepository(db);
formatter.format(entry);
}
更新
这个问题是很久以前的。我现有的for确实显示了未提交的代码。prepareTreeParser在显示差异的上下文中,我正在使用的当前代码是:
public void gitDiff() throws Exception {
Repository db = new FileRepository("/path/to/git" + DEFAULT_GIT);
Git git = new Git(db);
ByteArrayOutputStream out = new ByteArrayOutputStream();
DiffFormatter formatter = new DiffFormatter( out );
formatter.setRepository(git.getRepository());
AbstractTreeIterator commitTreeIterator = prepareTreeParser(git.getRepository(), Constants.HEAD);
FileTreeIterator workTreeIterator = new FileTreeIterator( git.getRepository() );
List<DiffEntry> diffEntries = formatter.scan( commitTreeIterator, workTreeIterator );
for( DiffEntry entry : diffEntries ) {
System.out.println("DIFF Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
formatter.format(entry);
String diffText = out.toString("UTF-8");
System.out.println(diffText);
out.reset();
}
git.close();
db.close();
// This code is untested. It is slighting different for the code I am using in production,
// but it should be very easy to adapt it for your needs
}
private static AbstractTreeIterator prepareTreeParser(Repository repository, String ref) throws Exception {
Ref head = repository.getRef(ref);
RevWalk walk = new RevWalk(repository);
RevCommit commit = walk.parseCommit(head.getObjectId());
RevTree tree = walk.parseTree(commit.getTree().getId());
CanonicalTreeParser oldTreeParser = new CanonicalTreeParser();
ObjectReader oldReader = repository.newObjectReader();
try {
oldTreeParser.reset(oldReader, tree.getId());
} finally {
oldReader.release();
}
return oldTreeParser;
}
以下设置适用于我:
DiffFormatter formatter = new DiffFormatter( System.out );
formatter.setRepository( git.getRepository() );
AbstractTreeIterator commitTreeIterator = prepareTreeParser( git.getRepository(), Constants.HEAD );
FileTreeIterator workTreeIterator = new FileTreeIterator( git.getRepository() );
List<DiffEntry> diffEntries = formatter.scan( commitTreeIterator, workTreeIterator );
for( DiffEntry entry : diffEntries ) {
System.out.println( "Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId() );
formatter.format( entry );
}
通过可以访问未提交的更改FileTreeIterator
。使用formatter.scan()
代替DiffCommand
的优点是格式化程序已正确设置以处理FileTreeIterator
。否则MissingObjectException
,当格式化程序尝试从存储库中的工作树中查找更改时,您将得到。
问题内容: 在连接到仓库以及添加,提交甚至循环提交文件的消息方面,我已经设法掌握了jGit文件的基础知识。 我接下来要做的是能够获取单个文件的所有提交消息,然后能够将单个文件还原回特定的参考/时间点。 问题答案: 这是基于所有父提交查找提交更改的方法 (标量代码) 请注意,TreeFilter.ANY_DIFF适用于单个树遍历器,并将返回根提交中可用的所有元素。 然后,您将不得不遍历树以查看您的文
问题内容: 我想在两次提交之间更改(添加,修改或删除)文件的路径。 在命令行中,我只需编写 用JGit执行此操作的等效方法是什么? 问题答案: 您可以使用来获取的列表。每个条目都有一个changeType,用于指定是添加,删除还是更改文件。一个S’ 和方法返回的路径名。该JavaDoc中列出了每个方法retuns对于给定的变型。 上面的示例列出了与其之间的更改文件,但可以进行更改以比较诸如的任意提
问题内容: 我一直在研究将要集成Git功能的基于Java的产品。使用Git的功能之一,我通过分阶段执行将10多个文件添加到Git存储库中,然后在一次提交中提交了这些文件。 以上过程可能相反吗?即查找作为提交的一部分提交的文件列表。 我在命令的帮助下获得了提交,但是我不确定如何获取提交的文件列表。 示例代码: 问题答案: 每个提交都指向一 棵树 ,该 树 表示构成该提交的所有文件。注意,这不仅包括使
我一直在开发一个基于Java的产品,Git特性将被集成到该产品中。通过使用Git的一个特性,我将10个文件添加到Git存储库中,然后在一次提交中提交。 上述过程是否可能相反?即查找作为提交的一部分提交的文件列表。 我在< code>git.log()命令的帮助下获得了提交,但是我不确定如何获得提交的文件列表。 示例代码:
JGit初学者问题: 我使用JGit从存储库读取文件(BLOB)并操作其内容。之后,我想将具有相同文件名的新内容作为新提交写回存储库。但是如何使用JGit提交新内容? 我的伪代码: 我是否必须将 写入一个文件,并使用 AddCommand 和 CommitCommand 提交此文件?或者,我可以将 String“即时”写入具有相同文件名的存储库吗? 网络上有没有一个示例如何使用JGit进行提交?
我正在尝试使用jgit将单个blob直接提交到存储库中。我知道如何插入blob并获得它的sha1,但是我很难为这个场景构建一个树。我似乎不知道如何正确地使用jgit的树抽象(TreeWalk之类的)来递归地构造一个树,几乎与以前的提交相同,只是blob的父树不同。 在JGit中执行此操作的惯用方法是什么? 我之所以这么问,是因为我正在编写一个程序,它类似于git存储库中文档的编辑器。在我的例子中,