Java 如何使用JGit获取特定路径(不包括给定分支中的合并)的最新修订id?
我正在将一个复杂的Mercurial查询转换为Git。我发现JGit可以用来实现同样的功能,而无需在代码中手工创建查询。如果文件在分支和排除合并中被修改,则目标是基于路径过滤器获取最新修订id。这就是我到目前为止所做的:Java 如何使用JGit获取特定路径(不包括给定分支中的合并)的最新修订id?,java,git,version-control,jgit,Java,Git,Version Control,Jgit,我正在将一个复杂的Mercurial查询转换为Git。我发现JGit可以用来实现同样的功能,而无需在代码中手工创建查询。如果文件在分支和排除合并中被修改,则目标是基于路径过滤器获取最新修订id。这就是我到目前为止所做的: public static void main(String[] args) throws IOException { try (Repository repository = CookbookHelper.openJGitCookbookRepository()) {
public static void main(String[] args) throws IOException {
try (Repository repository = CookbookHelper.openJGitCookbookRepository()) {
Ref head = repository.getRef("HEAD");
//Use pathFilter to filter this just for maps directory
PathFilter pathFilter = PathFilter.create("directory/path/*")
RevWalk walk = new RevWalk(repository)
walk.setRevFilter(RevFilter.NO_MERGES)
walk.setTreeFilter(AndTreeFilter.create(PathFilterGroup.create(pathFilter))
RevCommit commit = walk.parseCommit(${REVISION});
RevTree tree = commit.getTree();
// now use a TreeWalk to iterate over all files in the Tree recursively and you can set Filters to narrow down the results if needed
try (TreeWalk treeWalk = new TreeWalk(repository)) {
treeWalk.addTree(tree);
while (treeWalk.next()) {
// Some custom logic here
}
}
}
}
}
我在获得树漫游后有点被阻塞了。感谢您的帮助
编辑:
这是我正在转换的Mercurial查询:
hg log -r max((merge() and branch(${REVISION}) and ancestors(${REVISION}) " \
"and descendants(not branch(${REVISION}) and file('directory/path/*') " \
"and not ancestors(min(branch(${REVISION}))))) or max( file('directory/path/*') " \
"and branch(${REVISION}) and ancestors(${REVISION})) " \
"or min(branch(${REVISION})) and public() or p1(min(branch(${REVISION})))) --template {node}
我认为你的RevWalk设置非常接近。缺少的是设置排序顺序以首先显示较新的提交,并设置开始遍历的“点”。在您的情况下,起点将是有问题的分支
RevWalk walk=new RevWalk(存储库)
walk.setRevFilter(RevFilter.NO\u合并)
walk.setTreeFilter(AndTreeFilter.create(PathFilterGroup.create(pathFilter));
walk.sort(RevSort.COMMIT\u TIME\u DESC,true);
markStart(walk.parseCommit(repository.resolve(“refs/heads/branch name”));
if(walk.next()!=null){
//现在RevWalk指向最新的提交,其中
//文件已在分支中修改,不包括合并。
}
走。关();
使用普通Git,即Git日志——无合并——path/to/a/file
(但这不涉及重命名检测)。我不知道如何使用JGit,但我会注意到Mercurial查询肯定不能直接翻译到Git,因为“分支(…)”概念无法正确转换:在Mercurial中,一旦某个提交位于某个分支上,该分支就是它唯一的分支,而在Git中,包含任何给定提交的分支集(复数)会动态更改。min()、max()和类似public()的阶段测试也不可转换。