日志标签 topgit
Topgit 安装
3月10日
Topgit 用 shell 脚本语言开发,可以安装在所有类Unix环境中,例如 Linux、Mac OS X[1] ,以及Windows下的Cygwin、msysGit等。下面的官方网站链接介绍了Topgit的安装和使用方法:
- http://repo.or.cz/w/topgit.git?a=blob;f=README 。
1. Linux下安装Topgit
安装官方的 Topgit 版本,直接克隆官方的版本库,执行 make 即可:
$ git clone git://repo.or.cz/topgit.git $ cd topgit $ make $ make install
默认会把可执行文件 tg 安装在 $HOME/bin (用户主目录下的 bin 目录)下,如果没有将 ~/bin 加入环境变量 $PATH 中,可能无法执行 tg。
如果具有 root 权限,也可以在编译和安装时向make命令传递prefix环境变量,将 tg 安装在系统目录中。
$ make prefix=/usr $ sudo make prefix=/usr install
我对 Topgit 做了一些增强和改进,在后面的章节将予以介绍。如果想安装改进的版本,需要预先安装 quilt 补丁管理工具,然后进行如下操作。
$ git clone git://github.com/ossxp-com/topgit.git $ cd topgit $ QUILT_PATCHES=debian/patches quilt push -a $ make prefix=/usr $ sudo make prefix=/usr install
如果用的是 Ubuntu 或 Debian Linux 操作系统,还可以这么安装。
(1) 先安装 Debian/Ubuntu 打包依赖的相关工具软件。
$ sudo aptitude install quilt debhelper \ build-essential fakeroot dpkg-dev
(2) 再调用 dpkg-buildpackage 命令,编译出 DEB 包,再安装。
$ git clone git://github.com/ossxp-com/topgit.git $ cd topgit $ dpkg-buildpackage -b -rfakeroot $ sudo dpkg -i ../topgit_*.deb
(3) 安装完毕后,重新加载命令行补齐,可以更方便地使用 tg 命令。
$ . /etc/bash_completion
2. Mac OS X 下安装Topgit
在Mac OS X下安装官方版本的Topgit,在使用中会遇到问题。这是因为Mac OS X下部分shell命令的行为和相应的GNU命令的行为不一致,例如echo、paste和sed命令等。
在Mac OS X下可以使用Homebrew安装所需的GNU工具。如下:
$ brew install gnu-sed $ brew install coreutils $ brew install quilt
然后别忘了安装改造后的Topgit。
$ git clone git://github.com/ossxp-com/topgit.git $ cd topgit $ QUILT_PATCHES=debian/patches quilt push -a $ make prefix=/usr $ sudo make prefix=/usr install
3. Windows下安装Topgit
Windows下的msysGit因为缺乏Topgit依赖的命令行工具,因此很难在msysGit下运行Topgit。
Windows下的msysGit因为缺乏Topgit依赖的命令行工具(如:fgrep, install, make, mkfifo, mktemp, tsort 等),安装和运行Topgit会遇到困难。从安装好的 MSYS[2] 或 MSYS-CN[3]中可以提取所需软件到 msysGit 环境,实现Topgit在msysGit中的安装和运行。
Windows下的Cygwin拥有一个完整的POSIX环境,当安装了所需的工具(quilt 、make等)后,就可以正常的编译和使用Topgit。但是如果克隆的Topgit版本库的工作区文件的换行符是DOS格式换行符(CRLF),在安装过程中会遇到麻烦。从下面地址克隆的Topgit版本库,因为工作区根目录下存在一个.gitattributes[4] 文件,可以保证检出的工作区文件采用Unix格式的换行符(LF)。具体的安装方法同前。
[1] MsysGit的shell环境因缺乏Topgit需要用到的部分命令和编译工具不能安装和运行Topgit。
[1] Mac OS X及BSD中安装的sed命令和Topgit不兼容,需要安装 GNU sed,并使用改造后的Topgit。
[2] http://www.mingw.org/wiki/msys
[3] http://code.google.com/p/msys-cn/
[4] 参见第8篇第40章“40.3 换行符问题”

topgit 分支的图形化显示
6月18日
使用 Git + topgit 做版本控制,当 topgit分支(功能分支)非常多并且相互依赖比较复杂时,非常需要有一个直观的图形化的分支依赖图。
联想到我们使用 git 经常用到的 git glog 命令输出,如果 topgit 分支图能够有类似的显示就太好了:
| | * t/unittest | |/ | *---. t/message_localize | |\ \ \ | * | | | t/auth_log_for_fail2ban |/ / / / | * | | t/factor_invite |/ / / | * | t/factor_ldap |/ / | * t/include_macro_for_templates | * t/multi_language |/ * master
正在冥思苦想如何实现时,忽然发现 topgit 的 tg-summary 中原来已经有图形输出的实现,是借用 graphviz 工具进行图形化输出…
阅读全部内容 »
TopGit的使用技巧 (1)
3月10日
TopGit是基于分布式版本控制工具Git的一个轻量级的分支及补丁管理工具。使用TopGit可以很好的管理基于分支的开发模式。尤其对于二次开发人员来说,TopGit就是他们的杀手锏。
首先原型版本的代码用Git初始化成Git库,然后每给原型增加一个功能或者修改一个Bug都用TopGit创建一个分支(tg create t/feture1 或者 tg create t/bug1-fix),这样每一个功能或者Bug修复都是一个TopGit分支。当原型版本升级后,我们只需要切换到原型分支,即master分支 (git co master),然后导入原型的新版本代码,最后将TopGit的分支一个一个迁移到新的原型之上,就完成了一次版本的升级。真的很有用啊,这个东东!
下面介绍一些TopGit的使用技巧,尤其是关于分支update的问题
阅读全部内容 »
群英汇 TopGit 改进 (5): tg summary 执行的更快
1月23日
关于 tg summary 速度改进,其实不是因为 tg summary 使用中发现的问题。tg summary 是在使用 topgit 最常用到的命令。该命令用于查看各个功能分支和版本库的同步关系。
一般情况下,不太容易受到这个小问题的干扰,但是如果存在近百个功能分支,就有问题了:
- 执行 tg create <TAB>,即在 tg create 命令后按下 Tab 键,想查看当前分支列表,会发现速度很慢,需要一秒钟甚至更长的时间相应。可是用命令 git co 按下命令,瞬间就提供分支名的自动补齐
- tg depend 命令也存在类似问题
- tg patch 命令如果按下 Tab 键,也存在类似问题
- …
追根溯源,找到原来是 tg summary -t 命令的性能问题。命令补齐实际上是调用的 tg summary -t 命令来获取 topgit 分支的。
看看改进前和改进后,执行 tg summary -t 命令的效率:
- 改进前:
$ time tg summary -t >/dev/null real 0m1.799s user 0m0.580s sys 0m0.868s
- 改进后:
$ time tg summary -t >/dev/null real 0m0.040s user 0m0.016s sys 0m0.020s
- 可以看出改进后,执行时间由 1.8 秒缩短为仅仅 0.04 秒
我们是如何改进的呢?非常简单,简单到有些不好意思,您去 Github 上看看吧。
群英汇 TopGit 改进 (4): tg 命令补齐
1月22日
在 Bash 的 Shell 环境下,Linux 命令的命令补齐非常强大。
- 首先,要确保安装了 bash-completion 包
$ dpkg -l bash-completion ||/ 名称 版本 简介 +++-=================-=========-========================================== ii bash-completion 1:1.1-3 programmable completion for the bash shell
- 还有确认 Bash 的配置文件 /etc/bash.bashrc 已经开启了命令补齐,如下:
if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi
- Topgit 也提供 Bash 下的命令补齐,相应的脚本在目录 /etc/bash_completion.d/ 下
但是 Topgit 的命令补齐有一个问题,就是在执行 tg depend 命令,通过敲击 TAB 键获取分支列表或者自动补齐分支名称时出现异常!
$ tg depend <TAB> bash: __git_find_subcommand: command not found add
命令补齐报错!这是如何产生的呢?如何解决呢?
阅读全部内容 »
群英汇 TopGit 改进 (3): 更灵活的 tg patch
1月19日
命令 tg patch 命令,就类似 Hg/MQ 的 hg qdiff 命令,用于查看当前特性分支所有改动。
这个命令很常用,但是很快就发现这个命令的一个问题:即只能在代码库的根下执行,在任何子目录中执行 tg patch,显示的结果为空!有好几次都因为这个问题被骗了。这是什么原因呢?
群英汇 TopGit 改进 (2): tg 导出全部分支
1月18日
实际上这个补丁 export_quilt_all 才是我们在 topgit 上的第一个补丁。那么是什么原因导致我们奇痒无比,需要改动 Topgit 的代码呢?
我们使用 topgit 维护了几个开源项目,其工作模式是在几个特性分支中工作,工作结束后,将特性分支导出到 Quilt 格式的补丁列表。导出特性分支为 quilt 补丁的命令行是:
- 将当前工作的特性分支及其依赖的特性分支导出到 quilt 格式的补丁中
$ tg export --quilt EXPORT_DIR
- 如果需要导出多个特性分支,需要使用命令
$ tg export -b BRANCH1,BRANCH2,... --quilt EXPORT_DIR
这个命令主要的问题是,难以维护。如果我们把导出命令写入脚本,一旦特性分支增加或者删除,还要维护脚本。
为了方便将所有的特性分支一次性导出,我们曾经采用这个办法,避免过于复杂的命令行:
- 创建一个分支名为 t/all
- t/all 分支依赖其他所有特性分支
- 当在 t/all 分支,导出到 quilt 格式补丁列表时,包含了所有的特性分支
但是,这么做的副作用更大:
- 仍然难以维护。在创建一个新的特性分支时,会忘记将其加入到 t/all 的依赖中
- 当任何分支有提交,t/all 分支都要重新执行 rebase,最后导致代码库历史极为混乱
当我们决定公开代码库到 Github 上时,我们觉得 t/all 分支实在是太难看了。 :-P 于是决定 Hack!
最终的结果:使用一个简单的命令导出所有分支
$ tg export --all --quilt EXPORT_DIR
这就是我们的 “tg 导出全部分支”的补丁。参见:
群英汇 TopGit 改进 (1): tg push 全部分支
1月15日
TopGit 的项目名称是来自于 Topic Git 的简写,是用于管理多个 Git 的特性分支的工具。如果您对 Hg 的 MQ 有所了解的话,我可以告诉你,TopGit 是用 Git 维护补丁列表的工具;TopGit 就是 MQ 在 Git 中的等价物 ,而且做的更好。 :yes:
- 什么是 TopGit?参见 TopGit 手册
- TopGit 代码库:http://repo.or.cz/w/topgit.git
群英汇终于决定采用 Git 作为公司内部的代码管理工具,就是因为我们发现了 TopGit。参见:《群英汇版本控制系统的选择:subversion, hg, git》。
在每日的使用过程中,我们也发现了 TopGit 的一些问题,不断的挠到我们的痒处。遵循 ESR的理论 ,我们决定对 TopGit 进行改进,于是就有了我们在 Github 上的 TopGit 版本库: http://github.com/ossxp-com/topgit
最近,我又感觉到 TopGit 一个不便利的地方,今天终于临时决定 Hack。Hack 结束之后,就有了写一个系列文章的想法,于是这个系列文章,就从今天这个最新的 Hack 写起。

最新评论