【问题标题】:List remote changes in git repository using JGit (a real diff)使用 JGit 列出 git 存储库中的远程更改(真正的差异)
【发布时间】:2015-04-20 13:03:16
【问题描述】:

我正在尝试列出所有远程发生的更改,而不计算本地所做的更改。在这个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 jgit


    【解决方案1】:

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

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

      因此,解决方案是取“head”和“fetch_head”的base,然后执行base和fetch_head的diff。

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

      【讨论】:

        猜你喜欢
        • 2014-06-13
        • 2020-07-13
        • 2014-11-27
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        • 2016-01-22
        相关资源
        最近更新 更多