我知道使用--depth
git submodule update
选项可以使用浅子模块。
然而,如果我跑
git submodule update --init --recursive --depth 1
在我的项目中有几个子模块,我得到一个fatal: reference is not a tree
。所以我再次尝试使用
git submodule update --init --recursive --depth 100
哪个工作正常,但我想将深度保持在1。
在我看来,--depth 1
在子模块中提取最新的提交,而不是主存储库指向的提交,这就是为什么将其设置为100解决了问题,因为它提取了更长的提交列表,包括有针对性的。
不幸的是,如果是这种情况,那么我通常无法确定最新的100次提交是否包含我需要的提交。
如何告诉git使用指向提交而不是使用子模块的浅层克隆中的最新提交?
我在Windows上使用git 1.9.4。
答案 0 :(得分:7)
不幸的是,似乎没有办法只使用特定的提交ID来git fetch
。如果有,我真的想知道。但是我已经用两种不同的方式解决了你的问题:一,如果可能的话,就是在远程存储库上创建一个标记或分支,指向我想要的提交,比如我们称之为" ref& #34 ;.这样我可以获取远程参考,--depth
将适用于它,而不是最新的提示。而不是git submodule update --init
我做:
git submodule init
git clone --depth 1 -b ref --separate-git-dir .git/modules/sub/ repository sub
其中" sub"是子模块的名称和路径(为简单起见,我们说它们是相同的)
另一方面,如果您无法在远程存储库中创建标记或分支,那么就是在循环中搜索您想要的提交:
git submodule init
id=$(git submodule status|sed -ne 's/.\([a-z0-9]*\) sub.*/\1/p'
git clone --depth 1 --separate-git-dir -n .git/modules/sub/ repository sub
cd sub
while ! git rev-list $id ; do
git fetch --depth $((i+=1))
done
git checkout $id
您可以一次增加一次以上的提交以使其更快,但您最终可能会提交一些早于您想要的提交。