【问题标题】:List of files changed between commits with JGit使用 JGit 提交之间更改的文件列表
【发布时间】:2015-05-01 08:42:44
【问题描述】:

我想在两次提交之间更改(添加、修改或删除)文件的路径。

从命令行,我只是写

git diff --name-only abc123..def456

使用 JGit 的等效方法是什么?

【问题讨论】:

    标签: java jgit git-diff


    【解决方案1】:

    您可以使用DiffFormatter 获取DiffEntrys 的列表。每个条目都有一个 changeType,它指定文件是被添加、删除还是更改。 Entrys' getOldPath()getNewPath() 方法返回路径名。 JavaDoc 列出了每个方法针对给定更改类型返回的内容。

    ObjectReader reader = git.getRepository().newObjectReader();
    CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
    ObjectId oldTree = git.getRepository().resolve( "HEAD~1^{tree}" );
    oldTreeIter.reset( reader, oldTree );
    CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
    ObjectId newTree = git.getRepository().resolve( "HEAD^{tree}" );
    newTreeIter.reset( reader, newTree );
    
    DiffFormatter diffFormatter = new DiffFormatter( DisabledOutputStream.INSTANCE );
    diffFormatter.setRepository( git.getRepository() );
    List<DiffEntry> entries = diffFormatter.scan( oldTreeIter, newTreeIter );
    
    for( DiffEntry entry : entries ) {
      System.out.println( entry.getChangeType() );
    }
    

    上面的例子列出了HEAD和它的前身之间的更改文件,但可以更改为比较任意提交,如abc^{tree}

    【讨论】:

    • 只是一个问题 - 为什么 oldTree 处于“较新”版本?如果它实际上是新的,它是旧的。? HEAD^{tree} 表示当前头部提交(树),而 HEAD~1^{tree} 是当前头部的父提交 - 所以它的 1 次提交落后。
    • 你是对的,oldTreenewTree 应该被改变。我已经相应地编辑了帖子。
    • 嗯,很高兴知道这是一个错误。谢谢sn-p。刚用过。
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 2017-03-28
    • 2013-02-06
    • 2017-06-23
    • 2012-11-12
    • 2014-11-26
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多