JGit检测工作副本中的重命名

Ser*_*rny 6 java git jgit

Contex的

我正在尝试在工作副本中检测上次提交后发生的可能的文件重命名.在我的例子中,我有一个干净的工作副本,我这样做:

git mv old.txt new.txt
Run Code Online (Sandbox Code Playgroud)

运行$ git status显示预期结果:

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    old.txt -> new.txt
Run Code Online (Sandbox Code Playgroud)

我试过了

使用StatusCommand,我可以看到old.txt中删除列表,new.txt中添加列表.但我找不到将它们联系在一起的方法.

我知道RenameDetector它的存在,但它可以使用DiffEntry,我不知道如何在HEAD工作副本之间获得DiffEntries .

Ser*_*rny 8

没关系,找到了答案.JGit的API非常复杂..

TreeWalk tw = new TreeWalk(repository);
tw.setRecursive(true);
tw.addTree(CommitUtils.getHead(repository).getTree());
tw.addTree(new FileTreeIterator(repository));

RenameDetector rd = new RenameDetector(repository);
rd.addAll(DiffEntry.scan(tw));

List<DiffEntry> lde = rd.compute(tw.getObjectReader(), null);
for (DiffEntry de : lde) {
    if (de.getScore() >= rd.getRenameScore()) {
        System.out.println("file: " + de.getOldPath() + " copied/moved to: " + de.getNewPath());
    }
}
Run Code Online (Sandbox Code Playgroud)

(这个片段也使用Gitective库)