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