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

时间:2015-04-20 13:03:16

标签: 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中表示此命令。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我在EGit论坛上询问之后我已经找到了答案。 Here您可以找到更多详细信息。基本上,diff中的三点符号表示git diff $(git-merge-base A B) B,即(A和B的合并基数)和B

之间的差异

所以,解决方案是采取&#34; head&#34;和&#34; fetch_head&#34;然后执行base和fetch_head的差异。

要获得基本提交,请查看项目gitective

答案 1 :(得分:0)

我想可能在我们进行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());
    }

希望这有帮助。