java - 与 JGit 的最后一次提交的文件差异

标签 java git jgit

我正在尝试使用 JGit 获取文件从上次提交到最近未提交更改的差异。我怎样才能用 JGit 做到这一点? (使用命令行将是 git diff HEAD 的输出)

经过多次讨论(link1link2),我提供了一段代码,能够找到未提交的文件,但我无法获得文件的差异

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,因为格式化程序试图从存储库中的工作树中找到更改。

关于java - 与 JGit 的最后一次提交的文件差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486483/

相关文章:

java - Java-selenium 上的 StaleElementReferenceException 错误

java - CompareTo 比较方法违反了其一般契约

git - 塑料 SCM 与位桶中的 git

java - 使用 JGIT 进行浅克隆

java - 如何通过 URL Android 在 ImageView 中设置图像

java - primefaces 提交表单保存

GitHub 的 Atom 编辑器中的 Git 分支指示器

git - 使用 Windows 身份验证进行私有(private) BitBucket git 存储库?

java - JGit 获取 pull 文件

java - 使用 jGit 将文件推送到远程仓库