这个问题比较特殊,因为出现的频率不高,相信绝大部分人没遇见过。
背景
当我们使用了浅 clone 模式拉取仓库代码到本地时,会触发相关问题,这里引发第二个问题,什么是浅 clone ?
试想,如果你想研究某个库的源码,大部分人都会把仓库 clone 到本地,但 clone 可能会遇到一个问题,那就是慢!可能你花费了 10 来分钟还没好,然后果断放弃。
浅 clone 就是为了解决这一类问题而生,它可以限制 clone 的深度,不会下载 Git 协作的历史记录。
git clone remoteUrl --depth 1
--depth 1 表示只 clone 最近的一次 commit 记录,这样可以大大加快克隆的速度。
问题
以 G2 为例,我们浅 clone G2 的代码,git clone git@github.com:antvis/G2.git --depth 1 。
进入到 G2 目录 cd ./G2,我们尝试拉取一下远程分支 (get fetch --all) 并查看远程分支 (git branch -r) 。
可以看到,我们获取到的仅有 master 分支和一个 HEAD 分支,指向 master。 但 G2 其实远不止这些分支。
无法拉取远程分支,那我们想基于远程分支切出一个新分支也是不可能的,很多操作都会受限。例如我们基于远程的 v5 分支拉一个 v5-dev 分支出来,看一下 v5 究竟做了啥。
git checkout -b v5-dev origin/v5
很不幸的是,我们无法拉取,而且还会收获如下错误惊喜。
fatal: 'origin/v5' is not a commit and a branch 'v5-dev' cannot be created from it
有没有很爽?
解决方案
1.重新拉取
既然是浅 clone 导致的,那我不用浅 clone 呗,这虽然能解决问题,但不又回到起点了么~
2.浅 clone 远程分支
将远程分支 (v5) 浅 clone 到本地,让后基于其切出新分支,执行命令如下。
git remote set-branches origin v5
git fetch --depth 5 origin v5
git cb dev-v5
cb 是 checkout -b 的简写,建议大家配置一下 git 简写,vi .gitconfig 可查看,附一份我的简写。
[http]
lowSpeedTime = 999999
postBuffer = 524288000
version = HTTP/1.1
[alias]
co = checkout
p = push
a = add
b = branch
c = commit
d = diff
r = reset
aa = add .
pl = pull
ps = push origin master
cm = commit -m
cb = checkout -b
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
[core]
3.其它方案
还有没有其它方案呢?有,但作者很懒,欢迎评论区补充。