是否可以在存储库中浅克隆一个特定的提交,即深度为1?就像是
git clone http://myrepo.git 728a4d --depth 1
获取存储库状态,就像在SHA提交时一样728a4d...
?
这样做的目的是避免克隆整个存储库,然后在我们只对特定提交时存储库的状态感兴趣时检查该特定提交。
Answers:
从Git 2.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
直接执行此操作的语法。
git fetch --depth 1 origin d6be96bc...
秀fatal: Couldn't find remote ref d6be96bc...
allowTipSHA1InWant
,但既不allowReachableSHA1InWant
也没有allowAnySHA1InWant
。
注意:我的示例无助于通过提交哈希进行克隆,但将有助于克隆标签并具有轻量级的存储库。
如果您在“克隆”中只需要提交一次,并且要使用提交哈希,则简短答案为 NO。
我将以下命令构造(在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
目录大小(267K与2.6M使用full clone
):
$ du -h --max-depth=0 .git
267K .git
我想表示的是,--branch
可以带标签/分支。
https://git-scm.com/docs/git-clone#git-clone---branchltnamegt
--branch
也可以获取标签并在结果存储库中的提交时分离HEAD。
UPD
简而言之,它可以使用“引用”。您可以在这里阅读更多:git错误消息“服务器不允许请求未发布的对象”是什么意思?
此外,没有任何技巧,例如:
git fetch --depth 1 origin <COMMIT_HASH>
感谢@BenjiWiebe指出我的错误。
--branch
它不支持提交,只有分行的名字......这完全不解决这个问题。事实并非如此。
直接的答案是:你不能。
为什么?可以在这里找到详细的解释:为什么没有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>
正如@sschuberth所评论的:--depth
暗含--single-branch
。
代替克隆使用fetch命令:
# 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>
--depth
意味着--single-branch
,因此您可以在这种情况下将其删除。
git fetch
真正接受的SHA1 refspec
?
尝试while
在bash中使用:
git clone --depth=1 $url
i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done
这很慢,因为它会分别获取每个提交。您可以增加增量(以批量获取提交并提高网络性能),但这仍然是蛮力方法。