如何找到最后一个用JGit更改文件的人

时间:2016-11-07 14:42:47

标签: java git jgit

我需要上次在我们的GIT存储库中更改/提交文件的用户。

该项目由许多子文件夹组成,主分支有许多合并提交。

我试过了:

File gitWorkDir = new File("D:/gitfolder/");
Git git = Git.open(gitWorkDir);
RevCommit latestCommit;
String path = "test.txt";
try( RevWalk revWalk = new RevWalk( git.getRepository() ) ) {
    Ref headRef = git.getRepository().exactRef( Constants.HEAD );
    RevCommit headCommit = revWalk.parseCommit( headRef.getObjectId());
    revWalk.markStart( headCommit );
    revWalk.sort( RevSort.COMMIT_TIME_DESC );
    TreeFilter filter = AndTreeFilter.create( PathFilter.create( path ), TreeFilter.ANY_DIFF );
    revWalk.setTreeFilter(filter);
    latestCommit = revWalk.next();
    git.close();
}

存储库和HEAD提交存在,但latestCommit始终为空。

我是否必须定义文件的完整路径? 这是一个问题,主分支是如此"分支"所以也许找不到提交,或者还有什么问题可以解决?

1 个答案:

答案 0 :(得分:1)

在git中我会使用git log --follow path/to/your/file。它为您提供特定文件的完整git历史记录(包括提交作者,即使文件名已更改或文件已移至另一个文件夹)。

要使用JGit执行此操作,请查看this stackoverflow question

特别是这部分应该是有意义的(取自上面的回答):

 /**
 * Returns the result of a git log --follow -- < path >
 * @return
 * @throws IOException
 * @throws MissingObjectException
 * @throws GitAPIException
 */
public ArrayList<RevCommit> call() throws IOException, MissingObjectException, GitAPIException {
    ArrayList<RevCommit> commits = new ArrayList<RevCommit>();
    git = new Git(repository);
    RevCommit start = null;
    do {
        Iterable<RevCommit> log = git.log().addPath(path).call();
        for (RevCommit commit : log) {
            if (commits.contains(commit)) {
                start = null;
            } else {
                start = commit;
                commits.add(commit);
            }
        }
        if (start == null) return commits;
    }
    while ((path = getRenamedPath( start)) != null);

    return commits;
}