首页 > 解决方案 > 为什么git不提供clone参数来指定commitId?

问题描述

我想让git克隆一个分支的指定commitId,知道仓库地址、分支和commitId。我也想用它--branch="master" --single-branch --depth=1来优化克隆速度。

我用谷歌搜索了它,发现大多数答案是克隆该分支的完整提交历史记录(这对我的项目来说太大了),然后 git checkout commitId。

我其实更好奇为什么 git 不提供这样的参数。git clone --commitId="xxxxxxxxx" --branch="master" --single-branch --depth=1 谢谢!

标签: gitgithub

解决方案


或选项-b不一定是分支名称。例如:--branchgit clone

git clone -b v2.29.2 https://github.com/git/git.git --depth 1

工作正常。

由于上述原因,git clone -b <hash-id>(有或没有--depth)也应该被允许——但它不是:

Cloning into 'git'...
warning: Could not find remote branch 898f80736c75878acc02dc55672317fcc0e0a5a6 to clone.
fatal: Remote branch 898f80736c75878acc02dc55672317fcc0e0a5a6 not found in upstream origin

有多个单独的原因不允许这样做,但目前的关键一个——即直接访问提交哈希 ID 可能违反某种理论上的安全选项——正在被拆除,以允许部分克隆直接通过 ID 获取对象。一旦这足够普遍,就git clone应该学会做上述事情。

在那之前,按标签克隆(这是允许的)。

请注意:

--single-branch

标志已经暗示--depth 1:浅克隆默认是单分支克隆。此外,当-b指定一个标签(或者,在理论上,原始提交哈希)时,生成的克隆没有分支并且处于分离的 HEAD 状态,因此指定分支名称没有意义。


推荐阅读