Git只克隆一组具有完整历史记录的路径

cnh2zyt3  于 2023-02-07  发布在  Git
关注(0)|答案(1)|浏览(147)

我想知道是否有可能只克隆一个仓库中的一组特定路径,以及这些文件的历史记录,而不必克隆整个仓库?
如果没有,是否有更有效的方法来实现这一点?当我只需要回购的一小部分时,我希望避免在CI上定期克隆整个回购。
例如,我有存储库:

./
    - Src/
      - Dir1/
      - Dir2/
    - External/
      - Lib1/
        - file.cpp
      - Lib2/
        - file.cpp
      - Lib3/
    - Resources/
      - image.png
      - video.mp4

我只想克隆External/Lib 1和External/Lib 2以及它的历史记录。我不需要知道资源、源代码、Lib 3等。因此克隆这些内容效率很低。
我已经尝试过这样做
git clone --depth 1 --filter=blob:none --sparse <REPO>
那么
git sparse-checkout set External/Lib1 External/Lib2
这个方法很好用,但是我不能用这个方法查看文件的历史记录。如果有一种方法可以稀疏地只 checkout 这些文件的整个历史记录,这个方法将是理想的。
感谢任何帮助/建议
谢谢

wwwo4jvm

wwwo4jvm1#

我们的主机服务不支持部分克隆。对于CI作业,我们维护了一组CI作业可以访问的镜像存储库。在实践中,我们使用两种策略。
在第一种策略中,镜像资料档案库由git clone --mirror创建。它们是裸资料档案库。当CI作业启动时,它使用选项--reference-if-able /path/to/mirror/repository克隆资料档案库。这样,它从镜像资料档案库借用对象,并且只提取镜像资料档案库中不存在的丢失对象。此选项可与--single-branch--depth <n>git sparse-checkout。作业完成后,将删除配置项存储库。
我们定期更新这些裸存储库并运行git gc,比如一天一次或一周一次,这样镜像存储库就可以容纳尽可能多的数据。
在第二种策略中,镜像存储库由git clone --no-checkout创建。它们是没有任何 checkout 的非裸存储库。当CI作业开始时,它首先在存储库中获取所需的ref,然后为git worktree add /path/to/worktree revision的ref或提交创建工作树。稀疏 checkout 也与工作树兼容。作业完成后,CI工作树将被删除。根据我们的经验,最好在镜像存储库所在的磁盘上创建工作树。
对于这些非裸仓库,我们定期运行git gc,当有太多松散对象时,一些git命令会变得非常慢。
在镜像存储库的帮助下,我们找到了存储成本、时间成本和网络成本都达到平衡的点。

相关问题