我使用的是JGit 6.5.x和Java 17.我有一个很大的远程存储库(GB),但我只需要临时访问一个子目录(例如foo/bar/个)进行处理.单个子目录非常小(几百千字节).克隆一个浅层、裸露的存储库也相对较小:

try (final Git git = Git.cloneRepository()
    .setURI(REMOTE_REPOSITORY_URI.toASCIIString())
    .setDirectory(LOCAL_RESPOSITORY_PATH.toFile())
    .setBare(true)
    .setDepth(1)
    .call()) {
  System.out.println("cloned shallow, bare repository");
}

有没有一种方法可以克隆一个像那样的浅层、裸露的存储库(或任何其他最小版本的存储库),然后将单个子目录foo/bar临时签出到其他某个目录,以便我可以使用正常的Java文件系统API来处理这些文件?

请注意,我刚刚成功地完成了上面的克隆,并且还没有开始研究如何从这个裸存储库中签出单个子目录.

推荐答案

another answer的启发,我能够获得单深度克隆,并且只签出一条路径,而不需要执行裸克隆,同时使用类似的最小文件系统空间.这种方法的好处是只需要一个顶级目录;另一方面,裸存储库方法需要手动遍历并保存到单独的下级目录.

关键是使用setNoCheckout(true)(除了setDepth(1)之外),然后在手动克隆之后执行指定请求路径的单独签出.Note that you must specify 102 or specify a hash starting point, as there will be no branch because there is not yet a checkout.

try (final Git git = Git.cloneRepository()
    .setURI(REMOTE_REPOSITORY_URI.toASCIIString())
    .setDirectory(LOCAL_RESPOSITORY_PATH.toFile())
    .setNoCheckout(true)
    .setDepth(1)
    .call()) {

  gitRepository.checkout()
    .setStartPoint("HEAD")
    .addPath("foo/bar")
    .call();

}

这看起来很管用!我想它在引擎盖下使用了类似于Satyajit Bhatt's答案的东西.

Java相关问答推荐

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

存根基类的受保护方法

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

将响应转换为带值的键

多重延迟签名

try 判断可选参数是否为空时出现空类型安全警告

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

如何从Keyloak映射Hibernate实体中的用户

S,要对Java复制构造函数深度克隆所有属性进行单元测试,最可靠的方法是什么?

为什么我的回收视图会显示重复的列表?

对角线填充二维数组

在Java泛型中使用通配符时,如何推断类型

无法在IntStream上应用Collectors.groupingBy

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

java21预览未命名的符号用于try-with-resources

@此处不能应用可为null的批注

日落/日出时间计算出错