使用jgit以递归方式检查Git工作副本中的更改的最快方法是什么?

时间:2015-02-17 15:14:32

标签: java jgit

我需要检查Git工作副本的一部分以进行更改(递归),包括未跟踪的文件。这是我到目前为止所使用的:

public Status getStatus(String[] paths) throws NoWorkTreeException, GitAPIException {
    StatusCommand cmd = git.status();
    Arrays.asList(paths).forEach((p) -> {
        if (!p.isEmpty()) {
            cmd.addPath(p);
        }
    });
    return cmd.call();
}

然后我使用

检查返回的状态
public isModifed(Status status) {
    return (status.hasUncommittedChanges() ||
        status.getUntracked().isEmpty() ||
        status.getUntrackedFolders().isEmpty());
}

我想知道的是:有更快的方法吗?

1 个答案:

答案 0 :(得分:0)

据我所知,这是更高级JGit API提供的最快/唯一方式。

如果你需要更好的方式,你可以通过缓冲早期修改计算的结果来获得一些速度 - 因为你的用例是合适的。而且您必须使用较低级别的JGit API并实现StatusCommand自己做的大部分内容。

例如,迭代工作目录的子树并计算其中文件的object-id(SHA-1哈希)。然后迭代存储库的相同路径并收集对象ID。两组object-id都可用于确定文件是否已被修改,只有在存储库或工作树发生更改时才能进行缓冲和无效。