将文件diff与上一次提交的JGit进行比较 [英] File diff against the last commit with JGit
问题描述
我正尝试使用JGit从上次提交到最近未提交的更改中获取文件的差异。我怎样才能与JGit做到这一点? (使用命令行将是 git diff HEAD
的输出)
经过几次讨论(link1 , link2 )我带了一段代码,能够找到那些未被取消的文件,但是我无法得到文件的区别。
Repository db = new FileRepository(/路径/到/ GIT中);
Git git = new Git(db);
AbstractTreeIterator oldTreeParser = this.prepareTreeParser(db,Constants.HEAD);
列表< DiffEntry> diff = git.diff()。setOldTree(oldTreeParser).call(); (DiffEntry entry:diff){
System.out.println(Entry:+ entry +,from:+ entry.getOldId()+到:
+ entry.getNewId());
DiffFormatter formatter = new DiffFormatter(System.out);
formatter.setRepository(db);
formatter.format(entry);
$ b
更新
这个问题很久以前。我现有的for显示未提交的代码。在 prepareTreeParser
中使用的当前代码在显示差异的上下文中是:
pre > public void gitDiff()抛出异常{
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());
列表< DiffEntry> diffEntries = formatter.scan(commitTreeIterator,workTreeIterator); (DiffEntry entry:diffEntries){
System.out.println(DIFF Entry:+ entry +,from:+ entry.getOldId()+的
到: + entry.getNewId());
formatter.format(entry);
String diffText = out.toString(UTF-8);
System.out.println(diffText);
out.reset();
}
git.close();
db.close();
//此代码未经测试。对于我在生产中使用的代码,
//略有不同,但它应该很容易适应您的需求
}
private static AbstractTreeIterator prepareTreeParser(Repository repository,String ref )抛出异常{
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();
尝试{
oldTreeParser.reset(oldReader,tree.getId());
} finally {
oldReader.release();
}
返回oldTreeParser;
以下设置适用于我:
DiffFormatter formatter = new DiffFormatter(System.out);
formatter.setRepository(git.getRepository());
AbstractTreeIterator commitTreeIterator = prepareTreeParser(git.getRepository(),Constants.HEAD);
FileTreeIterator workTreeIterator = new FileTreeIterator(git.getRepository());
列表< DiffEntry> diffEntries = formatter.scan(commitTreeIterator,workTreeIterator); (DiffEntry entry:diffEntries){
System.out.println(Entry:+ entry +,from:+ entry.getOldId()+到:
+ entry.getNewId());
formatter.format(entry);
$ / code>
通过 FileTreeIterator
。使用 formatter.scan()
代替 DiffCommand
的优点是格式化程序的设置正确, code> FileTreeIterator 。否则,当格式化程序尝试从存储库中的工作树中找到更改时,您将得到 MissingObjectException
s。
I am trying to use JGit to get the differences of a file from the last commit to the most recent uncommitted changes. How can I do this with JGit? (using the command line would be the output of git diff HEAD
)
Following several discussions (link1, link2) I come with a piece of code that is able to find the files that are uncommited, but it I cannot get the difference of the files
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);
}
UPDATE
This issue was a long time ago. My existing for does display the uncommitted code. The current code that I am using for prepareTreeParser
, in the context of displaying the difference, is:
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;
}
The following setup works for me:
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 );
}
The uncommitted changes are made accessible trough the FileTreeIterator
. Using formatter.scan()
instead of the DiffCommand
has the advantage that the formatter is set up properly to handle the FileTreeIterator
. Otherwise you will get MissingObjectException
s as the formatter tries to locate changes from the work tree in the repository.
这篇关于将文件diff与上一次提交的JGit进行比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!