shallow clone
浅克隆经常在一些大型仓库中很有用——不用花费大量时间去clone一个完整的仓库,仅仅checkout出来某个分支(如master)的最新N次递交:
git clone --depth 1 https://github.com/openwrt/openwrt.git
由于clone的内容非常少,因此速度就大大提升了。查看git log
也只有最后一次递交记录而已。
问题来了
shallow clone对于快速clone代码很有用,但是clone出来的代码不会有远程仓库的tags,也不会有远程仓库的其他分支,如果需要切换tag或者切换分支应该怎么办呢?
取回tag
这个很简单
git fetch --tags
重新把远程的tag fetch到本地的origin仓库即可,然后在git tag
就会看到tag了,之后再用checkout
就可以了。
取回分支
这个就不是那么好办了,因为这个要求shallow clone必须转换为deep clone。如果你不想删掉现在的仓库目录重新clone的话,需要做下面两步:
- git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
- git fetch --unshallow
其中,第一步git config
是容易被忽视的,shallow clone之后,remote.origin.fetch
的值是+refs/heads/master:refs/remotes/origin/master
,所以会发现怎么fetch都没有其他分支。