我想知道是否有可能只克隆一个仓库中的一组特定路径,以及这些文件的历史记录,而不必克隆整个仓库?
如果没有,是否有更有效的方法来实现这一点?当我只需要回购的一小部分时,我希望避免在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 这些文件的整个历史记录,这个方法将是理想的。
感谢任何帮助/建议
谢谢
1条答案
按热度按时间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命令会变得非常慢。在镜像存储库的帮助下,我们找到了存储成本、时间成本和网络成本都达到平衡的点。