将文件diff与上一次提交的JGit进行比较 [英] File diff against the last commit with JGit

查看:959
本文介绍了将文件diff与上一次提交的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 MissingObjectExceptions as the formatter tries to locate changes from the work tree in the repository.

这篇关于将文件diff与上一次提交的JGit进行比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆