【问题标题】:How to shallow clone a single branch in git?如何在 git 中浅克隆单个分支?
【发布时间】:2011-06-23 05:10:17
【问题描述】:

我有一个 git repo,我想做一个浅拷贝,并且只拉一个分支。

This SO question 表示默认情况下 git clone 会拉取所有远程分支。我想做一个只有一个分支的浅拷贝。

我这样做是为了部署到生产环境中。完整结帐超过 400MB,但 head 的 git 存档只有 16MB。看来克隆拉下所有分支的行为导致我的下载量远远大于必要的量。

【问题讨论】:

  • 对不起...您是回答自己的问题还是我误解了? (git archive)
  • 注意:我已经用 git1.7.10 和新的“git clone --single-branch”选项更新了我的答案。

标签: git


【解决方案1】:

Jakub 已经提到了shallow clone of selected branches is possible,但做起来相当复杂。
他补充说:

但请注意,由于分支通常共享其大部分历史记录,因此仅克隆一部分分支的收益可能比您想象的要小。

我要补充一点,您不应该在生产平台中使用任何 VCS 工具(您只需要安装/监控生产运行所必需的东西)。
因此,git archive 仍然是提取所需内容的最佳方式,作为存档(ziptar,您可以在没有 Git 的情况下使用的格式,一旦转移到生产端)


2012 年 3 月更新:

upcoming git1.7.10(2012 年 4 月)实际上只允许您克隆一个分支:

git clone --single-branch

你可以在t5500-fetch-pack.sh看到它:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

该功能随后通过以下方式修复:

clone --single: 将 fetch refspec 限制为 fetched 分支

运行“git clone --single”后,生成的存储库安装了通常默认的“+refs/heads/*:refs/remotes/origin/*”通配符获取 refspec,这意味着后续的“git fetch”将最终获取所有其他分支。

更新 fetch refspec 以仅覆盖单个克隆的 ref 来纠正此问题。

builtin/clone.c: 正确检测从标签开始的克隆

31b808a (clone --single:limit the fetch refspec to fetched branch, 2012-09-20) 试图通过检查“@987654343”来查看要遵循的给定“分支”是否实际上是远程存储库中的标签@" 但它错误地使用了strstr(3);处理“分支”“refs/heads/refs/tags/foo”并使用“refs/tags/”的逻辑是非常错误的 参考层次结构。
代码真正想做的是看它是否以“refs/tags/”开头。


2016 年 9 月更新:git clone --single-branch --branch tag will work for chained tags 在 Git 2.11+(2016 年第四季度)中。

【讨论】:

  • 是的,单个分支的完整克隆可能不会节省太多,但我希望单个分支的浅层克隆接近 git 存档的大小,另外请允许我 git pull
  • @Allen:但是 git pull 意味着在生产平台上有 git,不是吗?这通常被认为是一种“坏”的做法。
【解决方案2】:

最近的 git 版本(我有 v2.7.3)通过调用支持 shallow cloning 仅一个分支:

git clone --depth 1 <repository>

【讨论】:

    【解决方案3】:

    您可以简单地进行普通(浅)克隆,然后在本地删除多余的分支(以及跟踪远程分支)。您仍然会拥有所有网络流量,但稍后您的磁盘空间会变小。

    【讨论】:

    • 但实际上删除底层文件可能很困难。您需要重新打包,扔掉 reflogs,并在到期日期设置为现在的情况下进行修剪。
    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2017-04-25
    • 2014-03-17
    • 2021-06-26
    • 2020-06-26
    • 2022-01-20
    相关资源
    最近更新 更多