在git中具有子模块的浅表克隆,如何使用指向提交而不是最新提交?

埃尔尼尼奥

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

布谷鸟

不幸的是,似乎没有办法git fetch仅使用特定的提交ID。如果有,我真的很想知道。但是,我用两种不同的方式处理您的问题:一种,如果可能的话,是在远程存储库上创建一个标记或分支,该标记或分支指向我想要的提交,例如我们称其为“ ref”。这样,我可以获取远程引用,--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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有任何自动方法来更新父git repo以指向其子模块的最新提交?

Git:自动提交具有相同消息的子模块

git如何知道在哪个提交中检出子模块?

如何在git子模块中“提交”更改?

如何重新设置git子模块,以保留对包含子模块的git存储库中对子模块提交的引用?

将Git子模块更新为最新的原始提交

git:在浅表克隆上克隆特定的提交ID

如何设置子模块以指向特定的提交而不获取它?

是否有查看 git 子模块中的差异详细信息而不是提交哈希的快捷方式?

如何自动从Heroku上的git子模块中提取最新提交?

Git子模块代码提交

当我结帐母版时,git子模块具有“新提交”

将子模块更新为最新提交

使用带有grunt-git和grunt-githooks的子模块的后提交钩子来提交Git“ Supermodule”

git子模块添加错误:没有签出提交

如何git checkout commit并使子模块更新到该提交?

git子模块如何还原到提交的版本?

Git子模块的提交与主仓库中的标签匹配

`git submodule update` 不会检出子模块中的提交

使用特定的提交编号添加git子模块

git子模块中的提交如何触发持续集成中的构建?

如何将Git子模块指针还原为存储在包含存储库中的提交?

除了子模块中的新提交外,我如何git add -u?

忽略git子模块的新提交

git子模块签出相同的提交

Git子模块和孤立的提交

如何压缩所有提交而不会丢失子模块?

使用.git目录克隆git子模块

如何git克隆除一个以外的所有子模块(使用--recursive)?