有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jgit如何过滤大文件克隆

我试图克隆一个包含一个大文件(2GB以上)的存储库, 正如article所提到的,Jgit可以处理的文件的最大大小是2GB。 我看到,通过纯git命令,我可以使用git clone --filter=blob:limit=100m过滤大文件 现在我想在使用Jgit的java代码中实现这个过滤器,这样就可以避免异常 Object too large (2,424,185,920 bytes), rejecting the pack. Max object size limit is 2,147,483,639 目前我使用Jgit进行克隆,如下所示:

Git  git = Git.cloneRepository()
                        .setURI(gitUrl)
                        .setBranch(branch)
                        .setCloneAllBranches(false)
                        .setCredentialsProvider(credentialsProvider)
                        .setDirectory(directory)
                        .call();

我想知道是否有向克隆添加过滤器的选项,以避免使用Jgit克隆大文件


共 (1) 个答案

  1. # 1 楼答案

    也许您可以使用InMemoryRepository,然后使用RevWalk/TreeWalk根据大小进行过滤

    https://github.com/centic9/jgit-cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/CloneRemoteRepositoryIntoMemoryAndReadFile.java

    下面的例子是一本jgit食谱:

     public static void main(String[] args) throws IOException, GitAPIException {
            DfsRepositoryDescription repoDesc = new DfsRepositoryDescription();
            InMemoryRepository repo = new InMemoryRepository(repoDesc);
            Git git = new Git(repo);
            git.fetch()
                    .setRemote(REMOTE_URL)
                    .setRefSpecs(new RefSpec("+refs/heads/*:refs/heads/*"))
                    .call();
            repo.getObjectDatabase();
            ObjectId lastCommitId = repo.resolve("refs/heads/" + BRANCH);
            RevWalk revWalk = new RevWalk(repo);
            RevCommit commit = revWalk.parseCommit(lastCommitId);
            RevTree tree = commit.getTree();
            TreeWalk treeWalk = new TreeWalk(repo);
            treeWalk.addTree(tree);
            treeWalk.setRecursive(true);
            treeWalk.setFilter(PathFilter.create(FILE_TO_READ));
            if (!treeWalk.next()) {
                return;
            }
            ObjectId objectId = treeWalk.getObjectId(0);
            ObjectLoader loader = repo.open(objectId);
            loader.copyTo(System.out);
        }
    

    请注意,我并没有特别尝试按文件大小进行过滤,但是您可以调查TreeWalk