git - JGit : Rename/Copy detection using FollowFilter

标签 git jgit

所以我想做的是检测源代码文件上的重命名/复制事件,因为它已添加到存储库中。我正在使用以下代码 -

/**
 * 
 * @param path source code file to retrieve complete history
 * @param start latest commit made for "path" to mark as start (tested with HEAD also)
 * @return
 */
private RevCommitList<RevCommit> getList(String path, RevCommit start) throws Exception {

        Config config = new Config(git.getRepository().getConfig());
        config.setString("diff", null, "renames", "copies");
        config.setInt("diff", null, "renameLimit", Integer.MAX_VALUE);
        DiffConfig diffConfig = config.get(DiffConfig.KEY);

        final RevWalk revWalk = new RevWalk(git.getRepository());
        //revWalk.reset();
        revWalk.setTreeFilter(FollowFilter.create(path, diffConfig));
        revWalk.markStart(revWalk.parseCommit(start));

        final RevCommitList<RevCommit> list = new RevCommitList<RevCommit>();
        list.source(revWalk);
        list.fillTo(Integer.MAX_VALUE);

        return list;
    }

这段代码有两个问题——

  1. 虽然 JGit 能够检测到“RENAMES”,但无法检测到“COPY”事件。无论何时遇到任何复制事件,它都会停止并且不会获取进一步的事件。有人可以帮助确定代码可能有什么问题吗?

  2. 我已经克隆了 wildfly ( https://www.github.com/wildfly) 存储库用于我的测试。我正在使用 git 的命令行工具检索文件历史记录,并使用上面提到的代码来确保至少在“复制”事件之前两者都给出相同的结果。但是git的命令行工具给出的结果和上面提到的代码似乎有相当大的差异。例如。当我运行 git log 命令时 -

    git log --follow --name-status -- build/src/main/resources/modules/org/jboss/as/clustering/common/main/module.xml
    

结果如下

  1. 659621a4ccfa9b45416537aebb14cda0419bb82d
  2. b1d3bf705461754307237dd9ca2a2211f3ef4022
  3. c1d1a77fd4beb956c1a353c02da972c58f5a3643

  4. d218ab3cdd086501d5d4bf585971b9358d303a60

  5. 601ecd1a4c8dfc4d2ad63e91b212abf36a049e74
  6. 0f15dc8a1330ee24816ac7f64d63afb0cd1ee725
  7. f4bfb891a9da0f052235299ad33d43bdf9ec7493

...

但我的 Java 代码给出了以下结果 -

  1. 659621a4ccfa9b45416537aebb14cda0419bb82d
  2. b1d3bf705461754307237dd9ca2a2211f3ef4022
  3. c1d1a77fd4beb956c1a353c02da972c58f5a3643

  4. 67dce2a276a410805b064e962b6950c6d07cf436

  5. 60537d19617a81e9505240f1dc5ad0567978fd96
  6. 4f1dff9ee4d79487d898c4917ca9bc3d842dc6cf
  7. 53cd538018a2bf57998c65202d27d6423a6f02f3

正如您所看到的,从第 4 次提交开始,所有提交名称都是错误的。知道可能出了什么问题吗?

(顺便说一句,Java 代码为我们从 SVN 迁移到 GIT 的存储库提供了正确的结果。)

最佳答案

通过此链接,JGit 的复制检测中似乎存在错误 - https://groups.google.com/forum/#!topic/repo-discuss/g96GClhlsh4 .

关于git - JGit : Rename/Copy detection using FollowFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19051129/

相关文章:

Git 似乎卡在我的旧帐户上

java - JGit:计数对象

java - Jgit - 获取分支的所有提交

java - 使用 JGit 连接到 GitLab 时出错

Git merge 策略忽略删除的文件

git - 在 Windows 上删除 Git 的缓存密码

r - 如何在 rmarkdown 中打印 git 历史记录?

java - JGit 设置 git : URI instead of https: for remote on CircleCI

maven - jgitflow :release-finish is not deleting the release branch

git - 将文件夹移动到另一个 git 存储库并保留历史记录