在本文中,我们将讨论如何在 Git 上进行浅克隆。 我们将讨论默认 git clone 命令和浅克隆之间的区别,然后学习如何在 git 上创建浅克隆。
默认的 git clone 有什么问题?
git 中的默认 clone 命令复制所有分支中对文件所做的所有还原的所有信息。 随着时间的推移,随着更多分支的创建和对存储库的提交,这个提交树/图变得越来越深。
对于具有大量提交历史的大型存储库,这会导致一些严重的克隆问题。
在某些情况下,包括树和 blob 在内的一些提交历史记录是多余的,例如:如果您正在处理一个已有多年历史的项目,那么从存储的角度来看,存储第一次提交的历史记录将毫无意义。
因此,在您不需要所有文件的所有提交历史记录的情况下,默认的 git clone 并不能真正达到目的。
什么是浅克隆?
浅层克隆允许您将提交历史截断为最新提交,即而不是所有提交历史,只下载最后几个提交。 提交树的叶子被修剪掉,使克隆的提交图更浅。 这是来自 Derrick Stolee 的 GitHub 博客的精美图形解释。
“在这些图中,时间从左向右移动。 因此,提交与其父项之间的箭头从右到左。 每个提交都有一个根树。 根树在 HEAD
提交在下面完全展开,而其余的树有指向这些对象的箭头。”
在这里比较这两个图,我们看到最近的提交头及其附加的树与其父级分离(这些与其父级分离的提交称为浅提交,并由图 2 中的单个绿色节点表示)。
如何进行浅克隆?
我们可以通过使用深度标志后跟代表 git 提交树深度的自然数来提及存储库的深度。
git clone --depth <depth> <upstream-repository-link>
以下是仅使用最新提交节点进行克隆的示例用法:
git clone --depth=1 https://github.com/Dsantra92/Google-Form-Automation
问题和备选方案
浅克隆对于仅克隆没有修订历史记录的文件非常有效。 这对于我们在构建结束时删除存储库的许多持续集成 (CI) 过程可能是有益的。 它对于快速提交到存储库也非常有用。 但是将头部从提交历史中分离出来有它自己的一系列后果:
- git merge-base 和 git log 等 Git 命令在完整克隆中没有按预期显示结果。
- 像 git-blame 这样的命令不起作用。
- 在完整克隆中,Git fetch 在计算上可能比 git-fetch 稍微昂贵一些,因为服务器必须提供对这些提交“相对”新的每个树和 blob。
因此,请务必了解您的用例并明智地使用深度标志。
参考:
- 德里克·斯托利 (Derrick Stolee) 的 Github 博客
- 官方 git clone 文档