在git中使用子模块的浅克隆,如何使用尖头提交而不是最新的?

时间:2014-11-28 12:40:14

标签: git git-submodules shallow-clone

我知道使用--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。

1 个答案:

答案 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

您可以一次增加一次以上的提交以使其更快,但您最终可能会提交一些早于您想要的提交。