我正在尝试列出远程发生的所有更改,而不计算在本地进行的更改。在这个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中表示此命令。有什么建议吗?
答案 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());
}
希望这有帮助。