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

ejk8hzay  于 2023-04-10  发布在  Git
关注(0)|答案(4)|浏览(175)

有没有可能在仓库中浅克隆一个特定的提交,比如深度为1?

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

来获取提交时使用SHA 728a4d...时的存储库状态?
这样做的动机是避免克隆整个仓库,然后检查特定的提交,而我们只对特定提交时仓库的状态感兴趣。

kqqjbcuj

kqqjbcuj1#

从Git 2.5.0开始(需要在客户端和服务器端都可用),你可以在服务器端设置uploadpack.allowReachableSHA1InWant=true来获取特定的SHA1(必须是完整的SHA1,而不是缩写):

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

请注意,我没有找到直接对git clone执行此操作的语法。

dgtucam1

dgtucam12#

注意:我的例子对通过提交哈希克隆没有帮助,但是它有助于克隆一个标签并拥有一个轻量级的存储库。
如果你的“克隆”中只有一个提交,并且你打算使用提交哈希,* 简短的答案是*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目录大小(* 267 K * 与使用完整clone时的 2.6M):

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

我想表示,--branch可以接受标签/分支。
https://git-scm.com/docs/git-clone#git-clone---branchltnamegt
--branch也可以在结果仓库中的那个提交处获取标记并分离HEAD。

UPD

简而言之,它可以接受“refs”。您可以在这里阅读更多内容:git错误消息“Server does not allow request for unadvertised object”是什么意思?


git fetch --depth 1 origin <COMMIT_HASH>

谢谢@BenjiWiebe指出我的错误。

kupeojn6

kupeojn63#

尝试在bash中使用while

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

这是相当慢的,因为它单独地获取每个提交;你可以增加增量(批量获取提交并提高网络性能),但这仍然是一种蛮力方法。

aij0ehis

aij0ehis4#

直接的答案是:你不能直接用git克隆来做。
为什么?详细的解释可以在这里找到:Why Isn't There A Git Clone Specific Commit Option?
你还能做什么?

如何将仓库克隆到特定的commit?(完全克隆)

# 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
使用fetch命令代替clone:

# 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>

相关问题