java - JGit 在工作副本中检测重命名

标签 java git jgit

上下文

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

git mv old.txt new.txt

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

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

我试过了

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

我知道 RenameDetector 的存在, 但它可以使用 DiffEntry ,而且我不知道如何在 HEADWorking Copy 之间获取 DiffEntries。

最佳答案

没关系,找到答案了。 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());
    }
}

(这个片段也使用了 Gitective 库)

关于java - JGit 在工作副本中检测重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17296278/

相关文章:

git - netlify 部署失败 : git ref refs/heads/master does not exist or you do not have permission

git - 我应该将 master merge 到一个分支,然后再 merge 回 master 吗?

git - 我如何用 jgit 做相当于 “git remote update” 的操作?

java - 使用 JGit 按分支或提交 ID check out Git 存储库

java - zip 文件可以使用 AES 加密吗

java - java 打开一定数量的文件

java - 从一个 fragment 打开到另一个 fragment 时多次单击单个按钮?

Git branch checkout 说虽然我的工作目录是干净的,但文件将被覆盖

java - 如何通过查看 gc 日志查看正在运行的垃圾收集器?

git - 有没有比 Git 更好的数据库(具有可序列化、不可变、版本化的树)?