Subscribe最新博客(更多

2013-03-04

墙不住的Git官网

微博中关于《Git Community Book》(Git社区书)本地化的帖子,使我想起久未造访的 Git官网 , 却吃惊地发现Git官网已遭G\F\W认证。值此“两会”召开、古月三昷卸任之季,G\F\W居然再次做出如此这般非和谐之举, 不啻于继股市暴跌后又一记对“十年和谐”响亮的耳光。

《墙不住的Git官网》这篇文章送给那些仍在攒钱买房,尚无闲钱购置境外主机以搭建VPN、SSH,也不会使用 goagent 的码农。

Git官网 的维护者是 GitHub 的 Scott Chacon,他也是 Git社区书 的主要维护者和 《ProGit》 的作者。

新设计的Git官网不但重新设计了Git的Logo,还将《ProGit》这本书贡献到官网,取代Git社区书成为官网上的官方教程。 (毕竟一人维护两套书负担太重,而且不小心会被人误解为 Copy & Paste。)

Git官网的源代码托管在GitHub,已由 旧版网站地址 更换到新的地址:

新网站基于 Rails 构建,默认使用 sqlite 本地数据库。其中 HTML 格式的 Git 手册、ProGit电子书的源代码并不在此版本库中, 而是要执行相应的 rake 任务,从Git版本库和 ProGit版本库中获取内容、编译并保存到 sqlite 数据库中。 下面介绍一下如何在本地搭建Git官网。

准备

  • 克隆Git版本库(可选)

    Git官网中的Git手册直接从Git项目的本地版本库中编译,会对 Git v1.0 之后的每一正式发布版本的手册进行编译。

    如果本地已经克隆了Git版本库,可以跳过这一步。

    如果没有克隆Git版本库,先克隆一份Git版本库。

      $ cd Your/WorkSpace/
      $ git clone git://github.com/git/git
    
  • 克隆Git官网版本库

      $ cd Your/WorkSpace/
      $ git clone git://github.com/github/gitscm-next
    
  • 进入到克隆出的Git官网版本库

      $ cd gitscm-next
    
  • 安装 Ruby 1.9.2 。

    (在 gitscm-next 目录下的 .ruby-version 这个文件指定了 ruby 的版本。)

      $ rvm install 1.9.2
      $ rvm use 1.9.2
    
  • 下载并安装依赖的 Gem 包。

    (由文件 Gemfile 设定 gem 包依赖)

      $ bundle install
    

Rails 应用配置

Git新官网是一个 Rails 应用。数据库的默认配置文件 config/database.yml 已指定使用 sqlite3 本地数据库。 执行如下命令即可创建该本地数据库。

  • 初始化本地数据库。(执行数据迁移操作)。

      $ rake db:migrate
    
  • 导入缺省数据

      $ rake db:fixtures:load
    

第一次启动应用

  • 启动Web应用

      $ script/rails server
      ...
      => Rails 3.2.11 application starting in development on http://0.0.0.0:3000
      ...
    
  • 文档页面 404

    从上面命令的输出可以看出启动的内置Web服务器运行在 3000 端口。打开 Web 浏览器,输入地址 http://localhost:3000/ , 墙外的 Git官网在本地重现了。在网站中四处转转,会发现文档部分的链接( doc/ )催悲地404了。

    这是因为相关文档需要从其他版本库获取数据并编译。

  • 退出Web应用

    在控制台按下 Ctrl+C 退出运行在 3000 端口的 Web 服务。

编译 Git 手册

阅读版本库根目录下的 README.md 文件(GitHub上项目的说明文件),可以看到编译文档的说明。

  • 编译Git手册。

    如果你有耐心,可以执行下面的命令,将Git v1.0 之后的 240 多个正式发行版本的文档逐一编译(当然很多小版本并未更新文档),并保存到数据库中。

      $ GIT_REPO=/Your/WorkSpace/git/.git rake local_index
    

    你也可以只编译Git某一个版本的手册。如下:

      $ GIT_REPO=/Your/WorkSpace/git/.git REBUILD_DOC=v1.8.1 rake local_index
    

    (关于该 rake 命令的具体实现参见脚本: lib/tasks/local_index.rake

  • 访问编译的Git手册。

    再次启动Web应用,文档页面仍然显示 404 错误。编译的Git手册文档藏到哪里了呢?从 Rails 的路由文件 config/routes.rb 文件可以猜出Git手册页面的URL地址为:

    按 Ctrl+C 退出Web应用。

编译 ProGit 和其他文档

执行下面命令可以编译出其余文档,包括《ProGit》电子书。

  • 更新Git下载链接,执行如下命令:

      $ rake downloads
    
  • 编译 ProGit 电子书。

    提供您的 GitHub 账号——将如下命令中的 your_github_username 和 your_github_password 用您的用户名及口令替换。 执行 rake 命令,通过 GitHub API (调用 octokit 包)远程读取 progit 版本库源码,编译电子书。

      $ export API_USER=your_github_username
      $ export API_PASS=your_github_password
      $ rake remote_genbook
    

至此 Git官网在本地部署完毕,运行内置 Web server:

$ script/rails server
...
=> Rails 3.2.11 application starting in development on http://0.0.0.0:3000
...

墙外的Git官网在本地重现: http://localhost:3000/

View Comments
2012-08-14

Git测试问卷完整版

在为深圳某客户提供 研发管理平台实施和培训的项目 中,应客户要求提供了两套问卷试题。背负考核任务去学习,团队转换配置管理工具的效果自然会更好吧。

问卷A最早公布于 我的博客,并由 @非专业IT民工 给出了答案和详尽的解释:

既然问卷A已经没有了神秘感,就把问卷B也拿出来。您可以通过

看到完整的测试题。

问卷B和问卷A的相似度非常高,就请保留一些神秘感吧,好让问卷B能够承担一些自测功能。公开问卷B的答案是毫无必要和没有技术含量的。

BTW,问卷的设计是在北京到深圳的飞机上匆匆完成的,对我来说为错误答案而凑数是最花脑筋的,不严谨之处敬请谅解。

View Comments
2012-07-05

Topgit 本地和远程分支的删除同步以及 git fetch --prune 分析

在 Google Group (需翻墙)上网友提了一个问题:“Topgit 本地特性分支删除后,如何清理远程版本库中相应分支?

这是一个非常好的问题,我也曾遇到,一直是以手工清除远程分支(及 Topgit 跟踪分支)的。

$ git push origin :t/feature-branch
$ git push origin :top-bases/t/feature-branch

好吧,为什么不“懒惰”一点,把清理远程版本库对应分支的工作写在 Topgit 代码中呢?于是写了一个补丁, 见:

同步删除远程版本库的 Topgit 特性分支和跟踪分支只完成了硬币的一面,另外一面是当远程版本库的 Topgit 特性分支和跟踪分支被他人删除后,如何本地获知?

直觉告诉我只要把 tg-remote.sh 代码中的 git fetch 命令换做 git fetch --prune 即可。 可是一试之下,大失所望,竟然将本地版本库所有 refs/remotes/origin/top-bases/ 下的引用全部删除! 难道这是 git fetch --prune 的 Bug?

重新编译Git(去掉 -O2 增加 -ggdb 编译参数),以便用 gdb 调试。

$ gdb --args git fetch --prune

最终从 builtin/fetch.c 的函数 query_refspecs() 返回值中看出端倪。

首先一个 Topgit 管理下的版本库,配置文件中会有如下的 fetch 配置:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = ...
    fetch = +refs/top-bases/*:refs/remotes/origin/top-bases/*

其中的两条 fetch 配置,将远程版本库的 refs/heads/*refs/top-bases/* 两个名字空间的引用 都获取到本地 refs/remotes/origin 名字空间下。

为清理本地陈旧的远程分支,先要根据上面两条 fetch 配置指令,反查出在远程版本库中的引用名称(见 remote.cmatch_name_with_pattern() 函数)。对于 refs/remotes/origin/top-bases/t/feature 名字 的引用,在反查时上面两条 fetch 都能够返回查询结果,分别为:

  • refs/heads/top-bases/t/feature
  • refs/top-bases/t/feature

两个查询结果,前一个错,后一个对。按照上面顺序出现的 fetch 指令,导致解析出来的引用名称为前一个(错误的), 显然无法在远程版本库的引用中找到,于是认为是过时的,于是将 refs/remotes/origin/top-bases/t/feature 删除。 一个最简单的解决方案是将上述两条 fetch 语句颠倒顺序,即可成功实现 git fetch --prune

Topgit 实现获取远程服务器特性分支时自动清理本地远程分支的补丁如下:

View Comments

我的书

联系方式