日志标签 Git
Android repo 魔法
8月31日
Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。
Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分命令封装,将 百多个 Git 库有效的进行组织。要想克隆和管理这百多个 Git 库,还真不是一件简单的事情。
在研究 Repo 的过程中,发现很多文档在 Google Group 上,非“翻墙”不可看。非法的事情咱不干,直接阅读 repo 的代码吧。
阅读全部内容 »

Repo——另一个Git协同模型
8月31日
Git 的神奇之处在于,你可以用很多不同的方式来使用它,而不像 Subversion,只有集中式一种方式。
最近又发现了一个 Git 新的协同模型 —— Repo,这个协同模型对于一个项目用到了多个Git版本库的协同开发非常有效。
实际上,这是上周在给一个团队做 “Git培训” 时,发现该团队在 Android 开发中,需要使用 Repo 这个工具来维护 Android 代码。于是花了些时间研究,补充了新的一章到讲义中…
Gistore 备份回滚改用分支实现
8月21日
Gistore 备份的回滚原来采用的方法是,建立和回滚 Tag(里程碑):
- 当 master 分支的提交(备份)数量达到预设次数(缺省200次),建立一个 Tag,如 gistore/1
- 当名为 gistore/XXX 的 tag 的数量达到一定程度,进行回滚,即:
- gistore/2 -> gistore/1
- gistore/3 -> gistore/2
- …
更改里程碑?!
正在写 Git 培训资料,开始写里程碑时,突然想到 gistore 实现中有更改里程碑的实现,这种实现是不好的:
- 里程碑在创建后,只在第一次同步(PULL)的时候,被获取
- 当里程碑修改后,其它人再执行 PULL 的时候,不会更新!
- Gistore原来的实现,如果发生备份回滚,远程同步的服务器不能获取更新后的Tag。在镜像服务器有失去部分备份历史的危险。
新的备份回滚用分支来实现
分支名称为 gistore/1, gistore/2, …。数字越大的分支保存近期的备份,数字小的保存老的回滚备份。

爱上Git——《Git培训讲义》摘录
8月17日
群英汇的开源版本控制系统服务和咨询主要是基于Subversion,群英汇的开源项目管理系统平台主要集成的也是Subversion。但是我们公司(群英汇)内部的开发一直在使用Git,所以实际上,我们在Git上也有着丰富的使用和管理经验。
最近一个客户选择了我们提供Git的培训和部署服务,于是从上周开始着手准备《Git培训讲义》。
这个客户是有着实际的需求,才不得不从 Subversion 迁移到 Git,虽然只是公司的部分项目组。
《Git培训讲义》中开头有一章,我给它命名为“爱上Git”,抓眼球是其次,主要是先让用户能够立刻“爱上Git”。
阅读全部内容 »
解决 gistore 备份数据中的 git 库(submodule)的备份
8月3日
昨天在从客户现场回公司的路上,想明白了 Gistore 备份出现的 AM 标识的备份数据就是含有变更的子模组。
之前 Gistore 不能解决的一个备份问题是,当备份的数据中包含 git 库,备份数据将不会保存在 gistore 版本库中,而是以 submodule 方式加入备份库。实际的效果是,数据没有备份下来。例如:
- 安装了 etckeeper,用于维护 /etc 下配置文件的变更。实际上 /etc 目录本身已经是一个 git 库了
如果在 gistore 任务建立前,/etc 目录已经 git 化,则不能有效的对 /etc 进行备份 - 某个备份数据的目录,被人为的 git 化。这可能是在 hacking 时遗留的 git 库
我在改动服务器的某些数据(如界面模板等),经常将目录 git 化,然后再修改/比较/提交
如果不能有效的对 git化的备份目录进行备份,肯定会收到惩罚。
在最早的实现中,只是在备份之后的后处理(post_check)查找以 git 子模组方式添加的目录,并打出相应的警告信息。如何能够自动进行处理,一直排在工作队列中,昨天晚上开始了修改。
检查子模组
首先要找出哪些目录是以子模组方式添加的。最开始想到了从状态中找出 AM 标识的子模组,进行修改,但是存在问题:1. 添加没有变更的git化的目录,不会显示为 AM(添加且含修改),而显示为 A(添加)。2. 不能有效的发现 gistore 版本库中已经提交数据中以 git 子模组方式添加的目录。
于是采用分析 git submodules status 命令的输出,确定子模组。不过这个命令需要多次迭代执行(遇到无 .submodules匹配报错退出),才能找到所有的子模组。
重新以普通目录和文件方式添加子模组
首先删除已经提交的按照子模组方式保存的目录,重新添加不能直接添加子模组目录,否则仍会按照子模组方式添加。采用的方法是:
- 删除已经按照子模组方式添加的目录
git –git-dir=repo.git rm –cached sub/module … - 在子模组目录下创建一个临时文件,并添加该临时文件
git –git-dir=repo.git –work-tree=run-time add sub/module/<TMPFILE> - 对子模组目录执行添加操作
git –git-dir=repo.git –work-tree=run-time add sub/module - 别忘了删除临时文件
git –git-dir=repo.git –work-tree=run-time rm sub/module/<TMPFILE> - 迭代执行,直到没有子模组发现为止
Gistore 版本升级为 0.2.3,在服务器上重新安装和执行,将原来子模组方式添加的目录重新纳入备份中,放心了。
Gistore 应用:备份博客数据
- 我们在公司服务器上创建了一个名为 wordpress 的任务,备份 wordpress 数据库导出文件,wordpress 配置文件,wordpress 插件目录,wordpress 上传图片及附件。
- 将 wordpress 任务的 git 库,加入 git 服务器中,并设置权限
- 每个有权限的公司员工,都可以使用 git 命令克隆/同步公司服务器上的 wordpress 版本库,将博客数据保存下来
Gistore(基于 git 的数据备份软件)升级至 0.2.x
7月29日
在 10年1月份的一篇 Gistore 发布声明的博客中 ,我介绍了我们自己开发的一个用户数据备份的小工具 Gistore。
是什么原因让我们开发备份工具呢?这是因为:
- 我们公司的数据备份的需要
- 客户数据备份需要更好用的软件
- rdiff-backup 和 flexbackup 的备份方案不够好
实际上 rdiff-backup 用做数据备份,已经足够好了,你可以从我们公司的维基中看到 rdiff-backup 的使用方法:
但是 rdiff-backup 的解决方案的问题是:
- 命令难记,包括我自己在数据恢复的时候还要一遍一遍的查阅文档
- 之所以命令难记,实际上是因为备份工具本身的使用率很低,只有在灾难恢复时候会用到,所以命令不熟悉是一定的。
- 数据的异地镜像比较复杂,需要引入其它工具
为什么不用 Git 开发一款工具呢?
- Git 的命令天天在用,实在是太熟悉了
- Git 的数据同步太方便了,在同步过程能够实时查看进度
此次 Gistore 升级,解决了半年多的使用过程中积累问题,并且增加了易用性。
阅读全部内容 »
Git 服务器软件 gitosis 的改进
7月20日
群英汇内部的 Git 服务器使用 gitosis 软件架设,能够实现针对版本库的授权,以及基于公钥的安全的无口令的版本库访问。
在 Gitosis 的使用过程中,我们根据需要对其进行了改进,以满足我们对授权和版本库管理上的需求:
- 增加了管理员角色,只有管理员才能够创建版本库
- 原来的实现只有 readonly 和 writable 两种权限,其中 writable 可以创建版本库。
- 我们权限分为三级:read/write/admin。拥有管理员(admin)权限,可以创建版本库,并自动具有读(read)写(write)权限
- 拥有写(write)权限也包含读(read)的权限
- 如果没有设置权限,禁止范围版本库
- 版本库匹配支持通配符,这样在授权的时候,可以用通配符为某个目录下的所有代码库授权
- 原有的实现,在配置文件中必须写入完整的版本库名称(路径)
- 当我们增加了管理员的概念后,增加通配符,就可以为特定的命名空间进行授权,而无须因为某个管理员要建库,还要修改授权文件
- 有了通配符后,读写权限的设置也更为简单。
- 通配符支持?,* 和 **。问号匹配一个字符,* 匹配任意字符(路径/字符除外),两个星号匹配包括路径分割符在内所有字符
- 增加了版本库路径映射的可用性。版本库路径映射在代码库重构中非常有用
- 增加了正则表达式匹配路径和替换映射
- 在权限检查的路径命中之后也检查路径映射,可以减轻错误配置的可能性
- 创建版本库只有写操作才进行,读操作不创建版本库
- 原来的实现支持即时创建版本库,在读取一个不存在的版本库时自动创建
- 读操作创建库,这会导致很多因为版本库克隆时路径输入错误导致错误建库
- 我们更改后,只允许在写版本库时并且具有 admin 权限才初始化新的代码库
- 版本库名称中允许出现中文(UTF-8)
- 基本上版本库命名都用英文字符,不过有个客户提出来支持中文版本库,我们就添加了这个支持
下面,拿一个配置文件来说明:

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 工具进行图形化输出…
阅读全部内容 »
Python setuptools hack: get revision from git-svn
6月2日
Python egg 打包有赖于 setuptools。setuptools 有一个功能很有意思,就是准备打包的软件如果使用了 subversion 版本控制系统,会自动将当前SVN的提交版本号附加在生成的软件包文件名中。
例如:pySvnManager-0.4.1dev-r131.tar.gz 中的 r131 含义就是从 svn 的 131 提交版本创建的源码包。
但是如果使用 git-svn来检出 svn 版本库,再运行打包命令 “python setup.py sdist”,就失去了这个帅呆了的功能。怎么办呢?
Hack 一下 setuptools 呗,之前就干过。
阅读全部内容 »
Subversion 用户眼中的 Git (13): Git 成为 SVN 的伙伴?
5月30日
很多公司不能代码开源,甚至也不能实现内部的代码开源,这相当大的原因是政治原因,而非技术原因。
那么当工作在 Subversion 的版本库下,是不是就和 Git 绝缘了呢?
非也,答案就是 Git-svn。


最新评论