如何浅克隆深度为1的特定提交?

是否有可能在存储库中用深度1克隆一个特定的提交

git clone http://myrepo.git 728a4d --depth 1

使用 SHA 728a4d...获得提交时的存储库状态?

其动机是为了避免必须克隆整个存储库,然后在我们只对该特定提交处的存储库状态感兴趣时检查该特定提交。

54934 次浏览

最直接的答案是: 不能直接使用 git 克隆来完成。
为什么? 详细的解释可以在这里找到: 为什么不存在一个 Git 克隆特定的提交选项?

你还能做什么?

如何将存储库克隆到特定的提交? (完全克隆)

# Create empty repository to store your content
git clone <url>
git reset <sha-1> --hard

更多信息:

如何克隆单个分支?

git clone <url> --branch <branch_name> --single-branch <folder_name>

如何从给定的分支克隆最新的提交?

git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>

如何浅克隆深度为1的特定提交?

正如@sschuberth 所评论的: --depth意味着 --single-branch

不要克隆,而是使用 get 命令:

# fetch a commit (or branch or tag) of interest
# In this case you will have the full history of this commit
git fetch origin <sha1>

尝试在 bash 中使用 while:

git clone --depth=1 $url
i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done

这个过程非常缓慢,因为它单独获取每个提交; 您可以增加增量(批量获取提交并提高网络上的性能) ,但这仍然是一种强制方法。

从 Git2.5.0开始(需要在客户端和服务器端的 都有中提供) ,您可以在服务器端设置 uploadpack.allowReachableSHA1InWant=true,以便能够获取特定的 SHA1:

git init
git remote add origin <url>
git fetch --depth 1 origin <sha1>
git checkout FETCH_HEAD

请注意,我没有找到一种语法来直接使用 git clone完成此操作。

注意: 我的示例无助于通过提交散列进行克隆,但有助于克隆一个标记并拥有一个轻量级存储库。

如果您的“克隆”中必须只有一个提交,并且您将使用提交散列 简单来说就是 没有

我使用这个命令结构(在 V2.13.2. windows. 1上测试过)来创建标记:

git clone --depth 1 git@github.com:VENDOR/REPO.git --branch 1.23.0 --single-branch

完整的例子:

$ git clone --depth 1 git@github.com:Seldaek/monolog.git --branch 1.23.0 --single-branch
Cloning into 'monolog'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 201 (delta 42), reused 32 (delta 5), pack-reused 0
Receiving objects: 100% (201/201), 190.30 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Note: checking out 'fd8c787753b3a2ad11bc60c063cff1358a32a3b4'.


You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.


If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:


git checkout -b <new-branch-name>


$ cd monolog

.git dir size (267K vs 2.6米,使用完整的 clone) :

$ du -h --max-depth=0 .git
267K    .git

我想表示的是,--branch可以采用标记/分支。

Https://git-scm.com/docs/git-clone#git-clone——-branchltnamegt

--branch还可以在生成的存储库中获取标记并在提交时分离 HEAD。

UPD

简而言之,它可以采取“参考”。 你可在此浏览更多资料: Git 错误消息“ Server does not allow request for unads object”是什么意思?

此外,没有技巧还包括:

git fetch --depth 1 origin <COMMIT_HASH>

谢谢@BenjiWiebe 指出我的错误。