原文地址: https://www.perforce.com/blog/git-beyond-basics-using-shallow-clones
本文是关于 Git 命令的 6 篇文章中的第 6 篇。
Git 在持续集成(CI)和持续交付(CD)环境中使用时经常会遇到的一个问题就是服务器负载。 因为 Git 的设计包括了一个仓库的每一个克隆都包含它的所有信息,每份克隆保存的不仅 仅是其中的文件,还有每个文件的所有提交过的修改。不难想象这很快会成为增加构建数量、 测试和部署流水线的瓶颈。
幸运的是,Git 支持浅克隆(shallow clone)的概念,它提供了一种更简洁更有意义的方式,
来描述在本地克隆一个仓库时将提交历史截断到一个特定的深度。如果将参数 --depth 1
传递给 clone 命令,就会使得该命令只将仓库中所有文件的最近修改复制到本地仓库。这
成了可能被 CI/CD 自动化过程累垮的 Git 服务器的救命稻草。例如:
1 | git clone --depth 1 https://github.com/jquery/jquery.git jquery |
上面的命令仅仅克隆了位于 GitHub 上的 jQuery 仓库的当前 HEAD 分支1。做一个不 严格的比较,这个命令在几秒钟内完成了,相比之下在没有指定 depth 开关时克隆整个仓 库用了超过 30 秒,节约了超过 90% 的时间。这一技巧可以极大地减轻需要被自动化过程 频繁拉取的服务器的负载。
用户还应该注意浅克隆在 Git v1.9 之前功能很受限。v1.9 及以后,Git 增加了对浅克隆 的 pull 和 push 操作。这使得在自动化构建操作中,可以对浅克隆的复本做修改、提交并 push 回源仓库。
一般来说,最好是避免这样的工作流,不过至少现在能做到了。 更多细节可以查看 the Git Book documentation。
阅读更多
想要关于 Git 命令的更多信息?下面是其他 Git Beyond the Basics 文章,可能会对你有 所帮助:
- Git Beyond the Basics 1: Version the Ignore File
- Git Beyond the Basics 2: Getting the Most with Git Aliases
- Git Beyond the Basics 3: Stashing Work in Progress
- Git Beyond the Basics 4: Bundle and Archive
- Git Beyond the Basics 5: Hooks for Automation
Footnotes:
译注:clone 命令在使用 --depth
选项时,默认使用 --single-branch
选项,
可以使用 --no-single-branch
选项使得 Git 拉取所有分支的指定最近 commit
数量。更多信息参考 the Git Book documentation。