12k
All articles

Git 浅克隆:是什么、何时使用以及如何使用

Git 浅克隆可减少下载量并加速 CI/CD 流水线,介绍何时使用深度限制、如何取消浅克隆,以及如何避免常见的历史记录错误。

OpenReplay Team
OpenReplay Team
Git 浅克隆:是什么、何时使用以及如何使用

克隆仓库时使用git clone通常会拉取整个提交历史。但如果你不需要全部历史记录怎么办?这就是浅克隆的用武之地。在本文中,我们将解释什么是浅克隆,它如何工作,以及何时使用它是有意义的——附带可直接复制粘贴的示例。

要点

  • 浅克隆限制了在git clone期间获取的历史记录数量
  • 它非常适合CI、大型仓库或快速设置
  • 学习如何使用--depth--single-branch--shallow-since

什么是Git中的浅克隆?

浅克隆是一种Git克隆,它只拉取仓库历史的一部分,而不是从头开始的所有内容。这显著减少了下载大小和时间。它在以下情况特别有用:

  • 你不需要完整的提交历史
  • 你想为CI/CD管道更快地设置
  • 你正在处理大型仓库

浅克隆与普通克隆的对比

特性 普通克隆 浅克隆 获取整个历史记录 是 否(有限的提交) 克隆速度 较慢 较快 Git操作(rebase, bisect) 完全支持 有一些限制 适合CI/CD 不是最佳选择 是

如何执行浅克隆

仅克隆最近的一次提交

git clone --depth=1 https://github.com/owner/repo.git

克隆特定分支的有限历史

git clone --depth=1 --branch main --single-branch https://github.com/owner/repo.git

克隆特定日期之后的提交

git clone --shallow-since="2024-01-01" https://github.com/owner/repo.git

如果你想完全跳过大文件下载,还可以在部分克隆中使用--filter=blob:none

你能将浅克隆转为完整克隆吗?

是的。如果你后来决定需要完整历史:

git fetch --unshallow

这会拉取缺失的提交并将你的浅克隆转换为完整克隆。

什么时候应该使用浅克隆?

在以下情况使用浅克隆:

  • 你只需要代码的最新版本
  • 你正在运行CI管道并希望更快地构建
  • 你正在检查或测试代码,而不需要完整历史

避免在以下情况使用浅克隆:

  • 你需要执行git bisectgit rebase或合并操作
  • 你正在贡献更改并需要访问提交历史
  • 你正在编写依赖于完整仓库上下文的工具

浅克隆的常见问题

Git操作可能会失败

一些命令假定有完整历史,在浅克隆中会抛出错误:

  • git merge-base
  • git rebase
  • git bisect

解决方法:运行git fetch --unshallow或在这些情况下避免使用浅克隆。

浅克隆可能会破坏单体仓库工具

像Lerna或Nx这样的工具可能假定完全访问仓库的提交历史,以便用于依赖图或受影响的包。请使用你的特定工具链进行测试。

结论

浅克隆是加速开发工作流的好方法,尤其是在CI或处理大型仓库时。只需了解其中的权衡——如果需要,你随时可以将其转为完整克隆。

常见问题

浅克隆更快吗?

是的。它获取的提交更少,所以下载和处理更快,尤其是在大型仓库中。

我可以从浅克隆推送吗?

是的,但一些与历史相关的操作可能会失败,除非先将克隆转为完整克隆。

如何撤销浅克隆?

运行`git fetch --unshallow`将你的仓库转换为完整克隆。

我可以在GitHub Actions中使用浅克隆吗?

是的——实际上,GitHub Actions默认使用浅克隆(使用`fetch-depth: 1`)。

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers

We use cookies to improve your experience. By using our site, you accept cookies.