Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JGit获取特定路径(不包括给定分支中的合并)的最新修订id?_Java_Git_Version Control_Jgit - Fatal编程技术网

Java 如何使用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()) {

我正在将一个复杂的Mercurial查询转换为Git。我发现JGit可以用来实现同样的功能,而无需在代码中手工创建查询。如果文件在分支和排除合并中被修改,则目标是基于路径过滤器获取最新修订id。这就是我到目前为止所做的:

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()的阶段测试也不可转换。