蒋 鑫
该用户没有分享资料
由蒋 鑫撰写的日志
Gist数据嵌入博客
9月14日
下面嵌入的Ruby代码,来自 gist.github.com
访问 http://gotgit.github.com/gotgithub/ 阅读电子书《GotGitHub》。
GitHub新书通告及邀请您关注微博账号
8月29日
关注本博客的网友会知道两件事:1、我最近刚刚出版一本书:《Git权威指南》;2、本博客最近更新近乎停滞。但有一件事可能不知道,就是我又写了一本书(尚未完稿),将以开源、免费的方式发布。
我从今天开始到上海出差一个星期,要四坐高铁,危险重重,故此把未完稿的书稿提前发布:
* 《GotGitHub》电子版: http://gotgit.github.com/gotgithub/
* 《GotGitHub》版本库: https://github.com/gotgit/gotgithub/
也许是写书的缘故,再写一些半长不短的博客打不起精神,而且由于很少登录本博客,导致对评论的审核和回复也非常不及时。如果希望更快找到我,可以关注我在新浪微博的账号。
版本库中一个大家都要改的文件,又不想每次提交而覆盖,怎么办?
6月10日
一个朋友打来电话,问:“使用Git做版本控制,版本库中一个大家都要改的文件,又不想每次提交而覆盖,怎么办?”
我的手机信号不好,没有听明白到底是什么文件让他的团队/客户如此纠结。我估计是某个IDE软件的项目文件,没有不行,但是IDE工作的时候,这个文件会经常随着本地项目的改动而变化,而且和每个人项目部署的目录相关,因此不同的人这个文件并不一致。我曾经还是一个Windows开发人员的时候,在 VisualStudio 6.0(maybe)中遇到。
我跟他说两个解决方案,一个比较诡异一点,一个比较普世一点。
Git版本库同步对部分版本库禁用
6月2日
使用 Gitolite 假设 Git 服务,可以比较容易的配置服务器的冗余备份,在即将出版的《Git权威指南》,以及之前写的一个文档: http://www.ossxp.com/doc/git/gitolite.html 都可以看到。
当配置了Gitolite 服务器镜像之后,服务器中任何版本库的创建和推送操作都会同步写到另外的镜像服务器中,但有时会有针对个别版本库禁止镜像的需要。
- 某些版本库保存一些二进制软件包之类非源码类文件,版本库太大,同步影响带宽。
- 个人版本库内容各异,做镜像没有必要。
下面就介绍改造 Gitolite ,实现同步可定制的需求。
《Git权威指南》官方网站上线
5月20日
《Git权威指南》已于6月底出版,各大书店和网上书店有售,具体参见官网相关链接。
官方网站地址:http://www.ossxp.com/doc/gotgit/
这个网站是用 Git 维护的,人人皆可参与的哦。
apt-cacher-ng: 万能软件包代理
4月20日
在 《Git权威指南》一书中,我在介绍 Cygwin 安装时,提到了如果整个团队在使用 Cygwin,最好架设一个代理服务器,这个代理服务器就好像一个本地软件包镜像,区别在于这个软件包镜像不是上游镜像的完整克隆,而是按需镜像。即第一次安装某个软件包时,代理服务器到上游获取然后缓存并发送给请求者,当再有用户请求同样的软件包时,直接从缓存中提取。架设这样的代理服务器,只需安装和配置 apt-cacher-ng 软件即可。
Apt-cacher-ng 本身就是一个 HTTP 协议代理,但是和其他 HTTP 代理服务器的区别在于:
- 能够“识别”出从不同站点(源)请求下载的软件包是否是同一个软件包,即源的合并功能。
- 支持请求重定向。即可以不直接从客户请求的地址下载,而是重定向到预先设定的可能更快的镜像进行下载。
Apt-cacher-ng 本来是服务于 Debian 和 Ubuntu,但是其通用性的设计,同样可以作为 Fedora, CentOS, Cygwin 等软件包代理。核心配置就是 Repomap 指令。
Remap-RepositoryName: MergingURLs ; TargetURLs
其中:
- RepositoryName 是本地的软件包镜像库(目录)的名称,该名称一旦确定不要变更。例如针对不同的系统软件包镜像,写为:debian, ubuntu, centos, 或 cygwin。
- MergingURLs 是用空格分割的 URL 地址或者匹配 URL 的字符串。当请求的软件包地址和这些地址匹配后,就认为是针对 RepositoryName 软件包镜像库的请求。
- 分号后面的 TargetURLs 也是用空格分割的 URL 地址。TargetURLs 是可选项,如果设置,则对该软件包镜像库的访问重定向由 TargetURLs 指定的地址。
Cygwin 的 Remap- 的设置:
Remap-cygwin: file:cygwin_mirrors.list /cygwin ; file:backends_cygwin
其中 file:cygwin_mirrors.list 所指向的文件包含所有 Cygwin 镜像(HTTP协议)地址,每个一行,这样就不至于让 Remap-cygwin 指令太长。该文件包含的地址有:
http://cygwinmirror.3gforphones.com/ http://cygwin.matway.net/ http://ftp.inf.tu-dresden.de/software/windows/cygwin32/ http://ftp.iitm.ac.in/cygwin/ ...
其中有的镜像是放在网站的 /cygwin/ 地址下,但也有地址是直接放在根下或者其他目录下。
文件 backends_cygwin 则设置为国内的 Cygwin 镜像。内容如下:
http://mirrors.163.com/cygwin/
配置 Apt-cacher-ng 作为 CentOS 软件包镜像和 Cygwin 类似,但需要多做一些工作。缺省的 apt-cacher-ng 只对特定的文件进行代理,包括 .deb, .rpm 文件,以及 Index, Packages.bz2, Release 等软件包索引文件等,而 CentOS 特有的软件包索引文件没有列在其中。
修改 /etc/apt-cacher-ng/acng.conf 配置文件,将 CentOS 的索引文件添加其中,下面示例中加粗内容即是为支持 CentOS 而新增内容:
VfilePattern = (^|.*?/)(Index|Packages\.bz2|Packages\.gz|Packages|Release|Release\.gpg|Sources\.bz2|Sources\.gz|Sources|release|index\.db-.*\.gz|Contents-[^/]*\.gz|pkglist[^/]*\.bz2|rclist[^/]*\.bz2|/meta-release[^/]*|Translation[^/]*\.bz2|repodata/.*|mirrorlist\?.*)$
Repo 新增 hack:URL 自动 DotGit 后缀控制等
4月19日
在《Git权威指南》书中提到的 Repo 的 Hack 主要是增加了两条新的子命令,实现脱离 Gerrit 服务器直接向 Git 服务器提交。即:
- 子命令 repo config 用于在清单库(Manifest)设置配置变量。
例如设置 repo.pushurl 配置变量,以便在直接向服务器推送时使用该地址(实际上还要在该地址后面添加版本库名称和 .git 后缀)。 - 子命令 repo push 用于绕过 Gerrit 服务器,直接向 Git 服务器推送。
该命令要参考清单库的 repo.pushurl 配置变量。
最近的使用过程中,又发现有改进的必要,于是做了如下新的开发:
版本库URL自动DotGit后缀控制
发现 FreeMind 在 SourceForge 上的版本库地址不能在地址的后面出现 “.git” 后缀后,必须对 Repo 进行改造,否则无法使用 Repo 克隆不带 “.git” 后缀的 Git 版本库。
新增的 Hack 见 repo@github//ossxp-com上的 这个提交。改进后的 Repo 会读取清单库中 XML 文件的 remote 元素中的 autodotgit 属性,如果该属性设置为 “false” ,则不会在构建 URL 时添加 “.git” 后缀。
例如 freemind-manifest.git 版本库的 default.xml 文件就有这么一段:
<manifest>
<remote name="sf"
fetch="git://freemind.git.sourceforge.net/gitroot/freemind/"
autodotgit="false" />
...加粗显示的 autodotgit 属性可以确保使用该远程版本库服务器克隆版本库时不会自动在URL后添加 “.git” 后缀。
为每个远程版本库服务器设置单独的 pushurl 模板
之前在清单版本库添加一个 repo.pushurl 配置变量,于是就设置了一个全局的 PUSH URL 模板,在执行推送时(repo push),向该配置变量设置的 URL 后面添加版本库路径便形成版本库的地址。
但是之前的这个实现太粗放,如果一个清单文件中使用了多个 remote 元素,设定了不同的远程版本库服务器,一个通用的 PushURL 模板是不存在的。于是做了如下改进。
- 例如为名为 sf (SourceForge) 的远程版本库服务器设置推送地址模板,可以如下:
$ repo config repo.sf.pushurl \ ssh://git@freemind.git.sourceforge.net/gitroot/freemind/
- 为名为 github 的远程版本库服务器设置推送地址模板,如下设置:
$ repo cofnig repo.github.pushurl \ git@github.com:ossxp.com/
如果某个远程版本库服务器没有在清单库中设置 repo.<remote>.pushurl 变量,默认会使用 repo.pushurl 配置变量。
用 repo 管理 Freemind 代码补丁
4月8日
FreeMind 是我几乎每天都会用到的软件,虽说脑图软件不少,但 FreeMind 的文件是纯文本、可版本控制,所以一直是我的最爱。当然为了能更好的进行版本控制,还需要做些改进,就是我在 SourceForge 上建立的 FreeMind-MMX 项目。
最近发现 FreeMind 的代码库由 CVS 迁移到了 Git,这下访问官方代码库可方便多了。但是转换的并非尽善尽美,参见我新浪微博的评论。
之前把我的改进代码连同 FreeMind 代码一并放在公司的代码库中(用Topgit特性分支),如果迁移到新的 FreeMInd 代码库,再放到 Github 上,不知道又要占用多少宝贵的 Github 托管空间。灵机一动,为什么不用 repo —— 由 Andorid 项目引入的多 Git 版本库管理工具?
使用 repo 之后,我在 Github上Freemind 相关版本库占用甚至不到1M!
- 官方版本库地址: git://freemind.git.sourceforge.net/gitroot/freemind/freemind
注意不能有 “.git” 后缀,如果添加后缀则无法克隆。 - Github 上 FreeMind-MMX 的 Manifest 库的网址: https://github.com/ossxp-com/freemind-manifest
- Github 上 FreeMind-MMX 的 代码补丁: https://github.com/ossxp-com/freemind-hacks
自己动手编译改进后的 FreeMind,即 FreeMind-MMX 的方法:
- 使用我改进的 repo,原因见微博上留言。
$ mkdir workspace $ cd workspace $ sudo curl -L -k http://github.com/ossxp-com/repo/raw/master/repo \ > /usr/local/bin/repo $ sudo chmod a+x /usr/local/bin/repo - 使用 Github 上的 FreeMind Manifest 库进行初始化。
$ repo init -u git://github.com/ossxp-com/freemind-manifest.git
- 同步版本库,包括 SourceForge 上的 FreeMind 和 Github 上的 freemind-hacks。
这一步骤时间可能会很长,因为 SourceForge 上 FreeMind 代码库太大(50M)。$ repo sync
- 完成同步后,在当前目录下有一个 build.sh 脚本,执行它完成改进版本 Freemind 的编译和打包。
$ sh build.sh
- 打包后的文件在 post 目录下。如果在 Mac OS X 上打包,还会生成 .dmg 扩展名的软件包。
参考阅读: 《Repo 新增 hack:URL 自动 DotGit 后缀控制等》
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 换行符问题”


最新评论