当前位置: 首页 > 知识库问答 >
问题:

JGIT-如何过滤大文件克隆

怀洛华
2023-03-14

我试图克隆一个包含一个大文件(2GB以上)的存储库,因为本文提到Jgit可以处理的文件的最大大小是2GB。我看到通过pure git命令,我可以使用git克隆--filter=blob:limit=100m过滤大文件,现在我希望在使用Jgit的java代码中实现这个过滤器,这样我就可以避免异常对象太大(2,424,185,920字节),拒绝这个包。最大对象大小限制为2,147,483,639目前我使用Jgit进行克隆,如下所示:

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

我想知道是否有选项添加过滤器到克隆,这样它就可以避免使用JGIT克隆大文件?

共有1个答案

幸鸿轩
2023-03-14

也许您可以使用InMemoryRepository,然后使用RevWalk/Treewalk根据大小进行筛选。

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

下面的示例是jgit-cookbook的副本:

 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);
    }
 类似资料:
  • 问题内容: 我正在按照以下指南使用jGit克隆远程现有存储库: https://github.com/centic9/jgit- cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/CloneRemoteRepository.java 我在示例中使用CFML: 克隆的效果很好,但是在我停止Java进程之前,文件锁不会释放在其

  • 问题内容: 我知道我可以按文件类型进行过滤,但是可以按文件大小进行过滤吗? 例如,一个JFileChooser仅显示3 MB内的图片。 问题答案: 简短的答案应该是,您尝试了什么?长答案是肯定的… 从技术上讲,您可以过滤以下任何属性或属性组合

  • 问题内容: 不久前,我正在寻找Java中的可嵌入的分布式版本控制系统,我想我已经在JGit中找到了它,它是git的纯Java实现。但是,示例代码或教程的方式并不多。 如何使用JGit检索某个文件的HEAD版本(就像或应该做)? 我想这涉及一些rev-tree-walking,并且正在寻找代码示例。 问题答案: 不幸的是,Thilo的答案不适用于最新的JGit API。这是我找到的解决方案: 我希望

  • 问题内容: 我该怎么办 与JGIT库? 问题答案: 您不能,JGit尚不支持客户端上的浅表克隆(不过,它在服务器端上)。

  • 问题内容: 我有一个像这样的数组: 现在,我想按某种条件过滤该数组,只保留值等于2的元素,并删除值不等于2的所有元素。 所以我的预期结果数组将是: 注意:我想保留原始数组中的键。 如何使用PHP做到这一点?有内置功能吗? 问题答案:

  • 当我尝试使用JGit api克隆现有的远程git存储库时,出现以下错误。 例外:org。日食jgit。应用程序编程接口。错误。运输例外:http://admin@本地主机:7990/scm/cp/myrepo。git安全连接到https://admin@本地主机:7990/scm/cp/myrepo。由于SSL问题,无法建立git 在我的课堂上,我使用下面的方法来克隆存储库。 我知道我可以通过使用