Thursday, March 10, 2011

Git remote add

今天打算下载 DRM 的源代码,但是公司的网络访问 git.kernel.org 特别慢。而内核的源码树,加上所有的修改历史,大概有 1GB 吧,就算 git 能够先压缩再下载,也得几百兆。可怜下载速度只有十几 KB 每秒。再联想到 git 不能续传...

公司倒是有自己的内核源码树,就在北京本地的服务器上。从那儿下载能有十几 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,真是无比强大...