git - 使用 JGit 列出 git 存储库中的远程更改(真正的差异)

标签 git jgit

我正在尝试列出远程发生的所有更改,而不计算本地所做的更改。在此post它演示了如何对远程进行比较,如下面的代码:

git.fetch().call();
Repository repo = git.getRepository();      
ObjectId fetchHead = repo.resolve("FETCH_HEAD^{tree}");
ObjectId head = repo.resolve("HEAD^{tree}");

ObjectReader reader = repo.newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
oldTreeIter.reset(reader, head);
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
newTreeIter.reset(reader, fetchHead);
List<DiffEntry> diffs= git.diff().setShowNameAndStatusOnly(true)
                        .setNewTree(newTreeIter)
                        .setOldTree(oldTreeIter)
                        .call();
for(DiffEntry entry : diffs) {
    System.out.println(entry.toString());
}

问题是,如果我们使用 diff,本地更改将被计算为“反向”远程更改。例如,如果我们在本地添加一个文件,则会将其计算为从远程删除,因为该文件在那里不存在。同样,如果我在本地删除文件,它将被列为远程添加。 您如何忽略这种情况?实际上这不完全是 jgit 的问题,如果你告诉我如何使用 git 命令,我可以自己找到一种使用 jgit 的方法...

编辑:三点是原始 git 中的解决方案,如下所示:

git diff --name-status HEAD...origin/master

现在我需要在 JGit 中表示这个命令。有什么建议吗?

最佳答案

我想也许我们可以在执行 git fetch 之前引用远程分支的头。如下图

Repository repository = git.getRepository();
    String branch = repository.getBranch();
    ObjectId head = repository.resolve("refs/heads/"+branch+"^{tree}");
    git.fetch();
    System.out.println(branch);

    Config storedConfig = repository.getConfig();

    Set<String> remotes = storedConfig.getSubsections("remote");

    System.out.println(remotes);

    ObjectId fetchHead = repository.resolve("FETCH_HEAD^{tree}");

    ObjectReader reader = repository.newObjectReader();
    CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
    oldTreeIter.reset(reader, head);
    CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
    newTreeIter.reset(reader, fetchHead);
    List<DiffEntry> diffs= git.diff().setShowNameAndStatusOnly(true)
            .setNewTree(newTreeIter)
            .setOldTree(oldTreeIter)
            .call();
    for(DiffEntry entry : diffs) {
        System.out.println(entry.toString());
    }

希望这有帮助。

关于git - 使用 JGit 列出 git 存储库中的远程更改(真正的差异),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29748675/

相关文章:

java - Jgit遍历特定分支的提交内容

java - JGit:如何压缩提交

git - 实现 Dropbox .gitignore

git - diff命令 'diff -b'和 'git diff'的区别

git - 使用 git 子模块还原 Nuget 包

git - jenkins git 如何 pull 而不是克隆?

java - 使用 JGit 列出当前分支中的所有标签

git - 企业情况下如何在Git中管理一个软件的版本?

java - 如何使用JGit查找提交距离?

java - JGIT:git 结账 --