ToC
--depth=1
表示只拉取最后一个 commit
记录,这会使得仓库的体积变小。 --single-branch
表示只拉取默认分支,不会附带其他分支的信息,这也会使得拉取的速度变快。
原理是只拉取最新版本的完整代码,从而舍弃以往的历史 commit 记录,git 中是通过 object 存储不同数据的:
- glob 对象存储文件内容
- tree 对象存储文件路径
- commit 对象存储 commit 信息,关联多个 tree
然后 HEAD、branch、tag 等是指向具体 commit 的指针,可以在 .git/refs 下看到,所以说每个版本的代码都是从 commit 对象作为入口关联起来的。指定了 depth=1
的时候就是只保留了最新的入口,历史入口就没下载了,所以这也会导致 git reset --hard hashId
的时候会失败,因为本地并没有这个 commit 记录,即便是后续再 git pull
也下载不了历史 commit 记录,也切换不了其他的 branch。
如果想要解决没有历史 commit 记录的问题,可以加上 unshallow
参数重新拉取一次:
而没有其他分支的情况则可以修改 fetch
命令的配置为:+refs/heads/*:refs/remotes/origin/*
:
以上。