公司倒是有自己的内核源码树,就在北京本地的服务器上。从那儿下载能有十几 MB 每秒,所以花几十秒钟就可以了。怎么办呢?毕竟两个源码树肯定是大同小异的。
这,就是 git 的强大之处了。且看命令:
$ git clone git://internal/kernel-tree
$ cd kernel-tree
$ git remote add airlied-drm git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git
$ git fetch airlied-drm drm-next:drm-next
remote: Counting objects: 284642, done.
remote: Compressing objects: 100% (55324/55324), done.
remote: Total 261757 (delta 210979), reused 253047 (delta 203096)
Receiving objects: 100% (261757/261757), 75.90 MiB | 10 KiB/s, done.
Resolving deltas: 100% (210979/210979), completed with 8754 local objects.
From git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* [new branch] drm-next -> drm-next
这样就在本地得到了一个 drm-next 分支,用来追踪 airlied 的 DRM 源码树。 同时 master 分支仍然是追踪公司自己的源码树。两者互不干扰,用 git checkout 来切换就行了。
也就是说,一个 git 仓库可以有多个 remote,而各个 remote 既相互独立,又可以共享数据。用上面的办法只需要下载 75 兆的数据,从输出中可以看到 git 确实 "reuse" 了一些东西。
再跟直接的 git clone 比较一下,objects 的数量有相当大的区别 (当然,我不确定这跟实际的下载量是不是一回事):
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git
Cloning into drm-2.6...
remote: Counting objects: 1908681, done.
remote: Compressing objects: 100% (309630/309630), done.
^Cceiving objects: 0% (1198/1908681), 500.00 KiB | 11 KiB/s
git,真是无比强大...