git 从根仓库稀疏检出子模块

git sparse-checkout of a submodule from a root repo

我有一个带有 4 个子模块的 main repo

我想 sparse-checkout kvm,过滤掉一些不符合 Windows 文件系统限制的恼人文件 (AUX为保留文件名,kvm树包含aux.{h|c})

我了解如何在普通存储库上执行 sparse-checkout,但是当我在子模块上执行相同操作时,它不起作用,.git/modules 目录丢失:

git clone https://github.com/KVM-VMI/kvm-vmi/
git -C kvm config core.sparseCheckout true
echo "!drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.*" >> .git/modules/kvm/info/sparse-checkout # ignore aux.*
echo "/*" >> .git/modules/kvm/info/sparse-checkout # checkout everything else
git submodule update --init

第一个 echo 命令将失败,因为 .git/modules 尚未创建。

我不知道谁负责创建这个目录。

我是不是在某处遗漏了“init”命令?

注:

我一直在 Whosebug 上或博客文章中寻找解决方案:

但它们对我不起作用,因为我不想克隆一个单独的 kvm 存储库,然后再将其添加到我的主存储库中。

谢谢。

使用 --no-checkout aka -n 自己克隆 kvm 存储库到 kvm 目录。根据需要进行设置,git submodule absorbgitdirs kvm 从超级项目移动 repo 并设置其 core.worktree 并将 .git 面包屑文件留在那个 kvm 工作树中,并且 git -C kvm reset --hard 完成结帐。

git clone https://github.com/KVM-VMI/kvm-vmi
cd kvm-vmi
git submodule init
git clone -n `git config submodule.kvm.url` kvm
mkdir kvm/.git/info

你准备好了

mkdir kvm/.git/info
git -C kvm config core.sparsecheckout true
printf %s\n '/*' '!aux.*' >kvm/.git/info/sparse-checkout
git submodule absorbgitdirs kvm
git -C kvm reset --hard