在Git下实现类似SVN的$Id$记号
之前写代码一直用SVN管理源代码,我把SVN仓库加设在了一台公网服务器上,但无法联网的时候就不能使用,最近把SVN的代码全部转移到了Git下,分布式的代码仓库就算是在没有网络的情况下也能记录代码的修改过程,初步感觉到了Git的方便之处。
SVN管理下的代码有一个不错的功能,就是可以在文本文件中通过$Id$的方式记录文件的最后修改日期和提交者,经过多方研究,Git下也实现了类似功能,见如下代码:
Version: $Id: Home.php 492 2012-11-16 22:48:30Z David $
步骤记录如下:
1、告诉Git那些类型的文件需要使用Ident 在仓库的根目录下(与.git同级)建立文件.gitattributes,写入内容如下:
*.php filter=cola-ident
*.css filter=cola-ident
*.js filter=cola-ident
cola-ident是处理ident的程序名,接下来我们开始加入cola-ident的处理程序。
2、让Git在文件签入签出的时候加上或去掉Ident
在仓库的根目录下(与.git同级)建立.gitfilters目录。 在仓库根目录下输入:
git config filter.cola-ident.clean '.gitfilters/cola-ident.clean'
git config filter.cola-ident.smudge '.gitfilters/cola-ident.smudge %f'
进入.gitfilters目录,建立两个文件: cola-ident.clean (这个文件负责清除$Id$标记)
vim .gitfilters/cola-ident.clean
#!/bin/sh
cat /dev/stdin | sed 's/\$Id[^\$]*\$/\$Id\$/g'
cola-ident.smudge (这个文件负责添加$Id$标记)
vim .gitfilters/cola-ident.smudge
#!/bin/sh
info=`git log -1 --pretty="format:%d %h %ai %an(%ae)" -- $1`
info='\$Id: '`basename $1`' '$info' \$'
cat /dev/stdin | sed "s/\\\$Id\\\$/$info/g"
3、测试
打开index.php文件,在文件头输入如下代码:
/* $Id:make git id$ */
然后执行add、commit操作:
$ git commit -am "加入了Ident的支持."<br />
/* 为了验证,此处我需要删除index.php,然后checkout它,看是否实现了想要的效果 */<br />
$ rm index.php<br />
$ git checkout -- index.php
index.php中$Id$的位置应该变成了如下字样:
$Id: index.php 098e89a 2013-02-20 21:05:24 +0800 [email protected] $
- END -
