git fetch 无法拉取远程分支

1,554 阅读2分钟

这个问题比较特殊,因为出现的频率不高,相信绝大部分人没遇见过。

背景

当我们使用了浅 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

19DDD125-6684-4AB3-BD1F-FAF52CC29467.png

进入到 G2 目录 cd ./G2,我们尝试拉取一下远程分支 (get fetch --all) 并查看远程分支 (git branch -r) 。

1FBF7181-A68B-4EFB-B6B7-A4118856AA4E.png

可以看到,我们获取到的仅有 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.其它方案

还有没有其它方案呢?有,但作者很懒,欢迎评论区补充。