Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git中带有子模块的浅层克隆,如何使用定点提交而不是最新提交?_Git_Git Submodules_Shallow Clone - Fatal编程技术网

git中带有子模块的浅层克隆,如何使用定点提交而不是最新提交?

git中带有子模块的浅层克隆,如何使用定点提交而不是最新提交?,git,git-submodules,shallow-clone,Git,Git Submodules,Shallow Clone,我知道可以使用--depth选项和git submodule update来创建浅层子模块 但是如果我跑 git submodule update --init --recursive --depth 1 在我有几个子模块的项目中,我得到一个致命:引用不是树。所以我又试了一次 git submodule update --init --recursive --depth 100 这是正确的,但是我想把深度保持在1 在我看来,--depth 1提取子模块中的最新提交,而不是主存储库指向的提交,

我知道可以使用
--depth
选项和
git submodule update
来创建浅层子模块

但是如果我跑

git submodule update --init --recursive --depth 1
在我有几个子模块的项目中,我得到一个
致命:引用不是树。所以我又试了一次

git submodule update --init --recursive --depth 100
这是正确的,但是我想把深度保持在1

在我看来,
--depth 1
提取子模块中的最新提交,而不是主存储库指向的提交,这就是为什么将其设置为100解决了问题,因为它提取了更长的提交列表,包括指向的提交

不幸的是,如果是这样的话,我通常无法确定最近的100次提交是否包括我需要的提交

我如何告诉git在带有子模块的浅克隆中使用指向的提交,而不是最新的提交


我正在Windows上使用git 1.9.4。

不幸的是,似乎没有一种方法可以只使用特定的提交ID来执行
git获取。
。如果有,我真的想知道。然而,我用两种不同的方式处理了您的问题:一种,如果可能的话,是在远程存储库上创建一个标记或分支,它指向我想要的提交,比如我们称之为“ref”。通过这种方式,我可以获取远程引用,
--depth
将应用于它,而不是最新的提示。而不是
git子模块更新--init
I执行以下操作:

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

您可以一次增加多个提交以加快速度,但最终可能会得到比您想要的更早的提交。

嘿。谢谢你的提示,看起来很接近我想要的。您知道是否可以从远程克隆特定标记,同时使克隆尽可能浅吗?深度1和标记ref一起工作吗?很抱歉回答得很晚,我记得你的问题的答案是肯定的,但我现在无法再次测试它。只是出于好奇,你试过了吗?而且,它是否按照你的意愿工作?是的,我试过了,它有点工作。但是,我选择了不同的项目设置,暂时避免使用子模块。已经有一段时间了,我接受了答案,因为它提供了一个解决方案(除了是唯一的:)。git submodule add上的
-b
选项如何,它也可以带标签吗?另请参见
git config-f.gitmodules子模块..shall true
with