如何获取JGit提交的文件列表

我一直在研究基于Java的产品,这些产品将集成Git功能。 使用其中一个Git特性,我通过登台将10多个文件添加到Git存储库中,然后在单次提交中提交它们。

上述过程的可能性是否相反? 即查找作为提交一部分提交的文件列表。

我在git.log()命令的帮助下得到了提交,但我不确定如何获取提交的文件列表。

示例代码:

Git git = (...);
Iterable<RevCommit> logs = git.log().call();
for(RevCommit commit : logs) {
    String commitID = commit.getName();
    if(commitID != null && !commitID.isEmpty()) {
    TableItem item = new TableItem(table, SWT.None);
    item.setText(commitID);
    // Here I want to get the file list for the commit object
}
}

每个提交都指向一个表示组成提交的所有文件的树。

请注意,这不仅包括通过此特定提交添加,修改或删除的文件,还包含此修订中包含的所有文件。

为了遍历一棵树,你可以使用JGit的TreeWalk

TreeWalk treeWalk = new TreeWalk( repository );
treeWalk.reset( commit.getId() );
while( treeWalk.next() ) {
  String path = treeWalk.getPathString();
  // ...
}
treeWalk.close();

如果您只对使用特定提交记录的更改感兴趣,请参阅此处:使用JGit或在此处创建Diffs:使用JGit将文件diff与上次提交进行比较


我从这个链接中给出的代码编辑了一些。 你可以尝试使用下面的代码。

public void commitHistory(Git git) throws NoHeadException, GitAPIException, IncorrectObjectTypeException, CorruptObjectException, IOException, UnirestException 
{
    Iterable<RevCommit> logs = git.log().call();
    int k = 0;
    for (RevCommit commit : logs) {
        String commitID = commit.getName();
        if (commitID != null && !commitID.isEmpty())
        {
            LogCommand logs2 = git.log().all();
            Repository repository = logs2.getRepository();
            tw = new TreeWalk(repository);
            tw.setRecursive(true);
            RevCommit commitToCheck = commit;
            tw.addTree(commitToCheck.getTree());
            for (RevCommit parent : commitToCheck.getParents())
            {
                tw.addTree(parent.getTree());
            }
            while (tw.next())
            {
                int similarParents = 0;
                for (int i = 1; i < tw.getTreeCount(); i++)
                    if (tw.getFileMode(i) == tw.getFileMode(0) && tw.getObjectId(0).equals(tw.getObjectId(i)))
                        similarParents++;
                if (similarParents == 0) 
                        System.out.println("File names: " + fileName);
            }
        }
    }
}

你可以尝试:

 git diff --stat --name-only ${hash} ${hash}~1

或者看到更大范围的差异:

 git diff --stat --name-only ${hash1} ${hash2}
链接地址: http://www.djcxy.com/p/26651.html

上一篇: How to get the file list for a commit with JGit

下一篇: commit hook: getting list of changed files