我需要上次在我们的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
始终为空。
我是否必须定义文件的完整路径? 这是一个问题,主分支是如此"分支"所以也许找不到提交,或者还有什么问题可以解决?
答案 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;
}