加载中...

6.2. 其他版本控制工具支持


如果曾经有人对 GitHub 只提供唯一的版本库格式(Git)托管表示过怀疑的话,那么今天看到 GitHub 对其他版本控制工具提供的愈发完善的支持,争议应该烟消云散了吧。

6.2.1. 用SVN操作GitHub

2008年4月1日,GitHub宣布推出基于SVN的SVNHub网站,后证实这是一个愚人节玩笑[1]。2010年愚人节,类似消息再起,可这一次不再是玩笑[2]。即对于GitHub上的每一个Git版本库,现在都可以用SVN命令进行操作。更酷的是 SVN 版本库使用的是和 Git 版本库同样的地址[3]。

例如用下面的 Git 命令访问本书的 Git 版本库,显示版本库包含的引用。其中分支master用于维护书稿,分支gh-pages保存书稿编译后的 HTML 网页用于在 GitHub 上显示。

  1. $ git ls-remote --heads https://github.com/gotgit/gotgithub
  2. ce5d3dda9b9ce8ec90def1da10181a094bea152f refs/heads/gh-pages
  3. c4d370b1b0bafb103de14e104ca18b8c31d80add refs/heads/master

如果使用 SVN 命令访问相同的版本库地址,Git 服务器变身为一个 SVN 服务器,将Git的引用对应为 SVN 风格的分支。如下:

  1. $ svn ls https://github.com/gotgit/gotgithub
  2. branches/
  3. trunk/
  4. $ svn ls https://github.com/gotgit/gotgithub/branches
  5. gh-pages/

SVN 支持部分检出,下面命令将整个主线trunk(相当于 Git 版本库的master分支)检出。

  1. $ svn checkout https://github.com/gotgit/gotgithub/trunk gotgithub
  2. A gotgithub/Makefile
  3. A gotgithub/README.rst
  4. ...
  5. Checked out revision 30.

还可以使用 SVN 命令创建分支,即相当于在 Git 版本库中创建新的引用。测试发现GitHub 尚不支持 SVN 远程拷贝创建分支,需要通过本地拷贝再提交的方式创建新分支。操作如下:

  1. 为避免检出版本库所有分支过于耗时,在检出时使用--depth=empty参数。
  1. $ svn checkout --depth=empty \
  2. https://github.com/gotgit/gotgithub gotgithub-branches
  3. Checked out revision 30.
  1. 进入到检出目录中,更新出trunk和branches两个顶级目录。
  1. $ cd gotgithub-branches
  2. $ svn up --depth=empty trunk branches
  3. A trunk
  4. Updated to revision 30.
  5. A branches
  6. Updated to revision 30.
  1. 通过拷贝从主线trunk创建分支branches/svn-github。
  1. $ svn cp trunk branches/svn-github
  2. A branches/svn-github
  3. $ svn st
  4. A + branches/svn-github
  1. 提交完成分支创建。
  1. $ svn ci -m "create branch svn-github from trunk"
  2. Authentication realm: <https://github.com:443> GitHub
  3. Username: gotgithub
  4. Password for 'gotgithub':
  5. Adding branches/svn-github
  6. Committed revision 31.
  1. 用 Git 命令可以看到服务器上创建了一个新的同名引用,并且指向和master一致。
  1. $ git ls-remote --heads https://github.com/gotgit/gotgithub
  2. ce5d3dda9b9ce8ec90def1da10181a094bea152f refs/heads/gh-pages
  3. c4d370b1b0bafb103de14e104ca18b8c31d80add refs/heads/master
  4. c4d370b1b0bafb103de14e104ca18b8c31d80add refs/heads/svn-github

下面尝试一下用 SVN 命令在新创建的分支svn-github中提交。

  1. 进入到之前检出完整主线trunk的gotgithub目录,并将工作区切换为分支branches/svn-github。
  1. $ cd ../gotgithub
  2. $ svn switch https://github.com/gotgit/gotgithub/branches/svn-github
  3. At revision 31.
  1. 修改文件,查看工作区状态。
  1. $ svn st
  2. M 06-side-projects/040-svn.rst
  1. 用 SVN 提交。
  1. $ svn ci -m "GitHub svn client support improved. Refs: http://git.io/svn"
  2. Sending 06-side-projects/040-svn.rst
  3. Transmitting file data .
  4. Committed revision 32.
  1. 同样查看 Git 版本库的更新,会发现svn-github分支的指向已和master不同。
  1. $ git ls-remote --heads https://github.com/gotgit/gotgithub
  2. ce5d3dda9b9ce8ec90def1da10181a094bea152f refs/heads/gh-pages
  3. c4d370b1b0bafb103de14e104ca18b8c31d80add refs/heads/master
  4. 64b80cb5331e28fdfb896e2ab3085779bf6ca019 refs/heads/svn-github

6.2.2. 用Hg操作GitHub

Hg(又称Mercurial)和 Git 一样也是一个被广泛使用的分布式版本库控制工具。如果一个熟悉 Hg 的开发者参与托管在 GitHub 上的项目,大可不必为更换版本控制工具而苦恼,GitHub 上的一个名为 hg-git[1]的开源项目可以帮上忙。

得益于 Hg 的强大的插件扩展机制,安装 hg-git 并将其注册为Hg 插件后可提供Hg操作 Git 版本库的能力。安装 hg-git 可以直接使用 easy_install 命令:

  1. $ sudo easy_install hg-git

还可以直接从GitHub上下载hg-git最新代码进行安装:

  1. $ curl -L -k -o hg-git.zip https://github.com/schacon/hg-git/zipball/master
  2. $ unzip hg-git.zip
  3. $ cd schacon-hg-git-*
  4. $ sudo easy_install .

插件 hg-git 依赖于 Dulwich 项目,如果在安装过程遇到 Dulwich 无法编译,可能是因为缺乏 C 编译器,或者尚未安装 python-dev 软件包。Dulwich 是一个Python语言的 Git 实现,因此 hg-git 在运行过程中无需 Git 命令行。

和其他 Hg 插件类似,安装完毕后需要修改Hg配置文件(如文件 ~/.hgrc )如下,以启用 hg-git 插件以及另外一个必须的 Hg 内置插件 —— bookmarks 插件。

  1. [extensions]
  2. bookmarks =
  3. hggit =

对 hg-git 安装配置完毕,就可以使用 Hg 操作 Git 版本库了。

  • 克隆 Git 版本库。
  1. $ hg clone git://github.com/ossxp-com/hello-world.git
  2. $ cd hello-world
  • Git 版本库的分支转换为 Hg 版本库中的 bookmarks。

    新克隆的 Hg 版本库默认会更新到最新提交(即 tip 版本),未必处于所需的分支上。用命令hg bookmarks显示分支列表,命令hg parents显示工作区对应的版本。

  1. $ hg bookmarks
  2. helper/master 10:2767ad9d7008
  3. helper/v1.x 8:994c2f0adc0b
  4. master 1:dcd365e3175c
  5. $ hg parents
  6. 修改集: 12:928384ca1e87
  7. 标签: jx/v1.0-i18n
  8. 标签: tip
  9. 用户: Jiang Xin <jiangxin@ossxp.com>
  10. 日期: Fri Dec 31 12:12:42 2010 +0800
  11. 摘要: Translate for Chinese.
  • 切换到所需的工作分支(如master分支)。

    用hg update -r命令切换分支。之后执行hg bookmarks命令会看到当前工作分支用星号标识出来。

  1. $ hg update -r master
  2. $ hg book
  3. helper/master 10:2767ad9d7008
  4. helper/v1.x 8:994c2f0adc0b
  5. * master 1:dcd365e3175c
  • Git 的里程碑也被记录,并可被 hg tags 命令显示。
  1. $ hg tags
  2. tip 12:928384ca1e87
  3. jx/v1.0-i18n 12:928384ca1e87
  4. jx/v2.3 10:2767ad9d7008
  5. ...
  • 使用hg pull命令和hg push命令可以实现和Git版本库的同步。

  • 有的命令如hg outgoing可在 1.7 版本的Hg中运行正常,但对于高版本库的 Hg 存在兼容性问题。

实际上 hg-git 插件并非只针对 GitHub 的版本库,而是可以支持任意 Git 版本库包括本地 Git 版本库。为了提供对 Git 版本库的透明支持,对 Git 版本库的 URL的写法有特殊要求,即要能够从协议名称区分开 Git 版本库和默认的 Hg 版本库。

  • Git协议:

    git://example.com[:port]/path/to/repo.git

  • SSH协议:

    git+ssh://[user@]example.com[:port]/path/to/repo.git

  • HTTP协议:

    git+http://[user@]example.com[:port]/path/to/repo.git

  • HTTPS协议:

    git+https://[user@]example.com[:port]/path/to/repo.git

  • 本地协议:

    /path/to/repo.git


还没有评论.