⇤ ← Revision 1 as of 2006-01-11 06:32:59
Size: 32
Comment:
|
Size: 5098
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 2: | Line 2: |
{{{CVS太古老,SVN正当年; 版本管理是基础,然则可以更有用! }}} ==== 缘起 ==== * 很早就听说CVS 在hacker 手里什么花样都玩的出来!写日志,写小说,聊天…… * 后来尝试的[:CvsRootHook:使用cvs来维护内容] 果然可行 * 但是非常的麻烦,而且要频率启动一个检测脚本来配合数据的同步... * 使用 SVN 作为主要的版本管理系统后,当然的也想同理进行,有版本控制的内容维护! ==== 研究 ==== '''SVN 有hook 嘛?怎么使用?''' * 看书先! [http://svnbook.red-bean.com/ 《使用Subversion进行版本控制》]的在线主页 * [http://www.subversion.org.cn/svnbook/1.1/index.html 中文1.1版本] * 嗯嗯!果然不出所料,有! [http://www.subversion.org.cn/svnbook/1.1/svn-ch-5-sect-2.html#svn-ch-5-sect-2.1 钩子脚本] * 看样子SVN没有玩太多的事务,就明晰的分了五种: 1. start-commit 提交前触发事务 1. pre-commit 提交完成前触发事务 1. post-commit 提交完成时触发事务 1. pre-revprop-change 版本属性修改前触发事务 1. post-revprop-change 版本属性修改后触发事务 ==== 实现 ==== '''那未我只是要自动的将所有的指定更新同步到目标中''' * 当然是 `post-commit` ! {{{#/path/to/u/SVNrepo/hooks/post-commit.tmpl ... REPOS="$1" REV="$2" #commit-email.pl "$REPOS" "$REV" [email protected] #log-commit.py --repository "$REPOS" --revision "$REV" ... }}} * 按照说明,只要将 post-commit.tmpl 重命名为 post-commit SVN 就可以运行了! * 但是! log-commit.py遍查不到,可以看到的 mailer.py 也大量调用 subversion-python-1.1.3::svn 模块,实在不明白 * 好容易 看到[http://svn.collab.net/repos/svn/branches/1.2.x/contrib/hook-scripts/commit-block-joke.py commit-block-joke.py] 比较简单,但是怎么也不调用?! * 最终还是要[http://svn.haxx.se/users/archive-2006-01/0349.shtml 问列表] * 才知道原来是文档没有看透:{{{ 由于安全原因,Subversion版本库在一个空环境中执行钩子脚本—就是没有任何环境变量, 甚至没有$PATH或%PATH%。 由于这个原因,许多管理员会感到很困惑,它们的钩子脚本手工运行时正常, 可在Subversion中却不能运行。 要注意,必须在你的钩子中设置好环境变量或为你的程序指定好绝对路径。 }}} * 有简单的合理测试方式:{{{ $ env - ./post-commit /var/lib/svn-repos 1234 }}} * 这样一来果然快速调整好调用关系:{{{ ... HOOKS="/path/to/u/svnrepo/hooks/script" $HOOKS/post-commit.py "$REPOS" "$REV" }}} * 以Pythonic 的精神快速组织一下子:{{{#!python #!/usr/local/bin/python #coding=utf-8 import sys,os,time LOOK = "/usr/local/bin/svnlook" SVN = "/usr/local/bin/svn" LOGFILE = "/path/to/u/hooks/log/post-commit.log" f = open( LOGFILE, "a+" ) TSTAMP = "%s"%time.strftime("%y-%m-%d %H:%M:%S", time.localtime()) def autoco(dirs,svn,mark,aim,mod): """自动检出指定项目的代码到指定目录 - dirs 本次修改了的目录 - svn svn 命令所在地 - mark 匹配项 - aim 输出目标 - mod 检出的模块 要求目标路径有预先检出的环境! """ if mark in dirs: print >> f,TSTAMP+" %s marked::%s >>>> updating..."%(("+"*7),mark) upsvn = svn+" update %s"%(aim+mod) print >> f,TSTAMP+" "+"+"*7 up = os.popen(upsvn).read().strip() print >> f,up else: print >> f,TSTAMP+" -------- marked null >>> update::nothing" def changedirs(look,rev,repos): """使用 svnlook 得到修改的路径 """ dirs = os.popen( LOOK+" changed -r "+ rev + " " + repos).read().strip() return dirs def usage(): print "Usage: " + sys.argv[0] + " REPOS REV\n" print >> f,TSTAMP+"Usage: " + sys.argv[0] + " REPOS REV" sys.exit(0) if __name__ == '__main__': if len(sys.argv) != 3: usage() repos = sys.argv[1] rev = sys.argv[2] print >> f,TSTAMP+" repos::"+repos+" rev::"+rev ## Blog事务 autoco(changedirs(LOOK,rev,repos),SVN ,"pyblosxom" ,"/path/to/ur/pyblosxom" ,"") }}} * 关键就是:'''一切都使用绝对路径!''' ==== 小结 ==== '''原理都非常简单,但是实施时要时刻保持清醒!''' * 基本的行动路线: 1. 准备 hooks 1. 安装调试 1. 部属目标工作复本![[FootNote(此处有个小遗留问题:权限! 聪明的你一定知道怎么修正的哪!-))]] * 提示,注意先后顺序,否则会造成版本冲突,而没有将目标文件同步! 1. 本地加入内容模块,追加到SVN中,并提交 1. 增加hooks 处理,确定事务处理 1. 服务器端,检出工作复本 1. 开始透过 SVN 进行内容维护! * 邮件列表实在伟大,让全球任何地方的人可以分享体验! |
维护PyBlosxom 内容
{{{CVS太古老,SVN正当年;
- 版本管理是基础,然则可以更有用! }}}
缘起
- 很早就听说CVS 在hacker 手里什么花样都玩的出来!写日志,写小说,聊天……
后来尝试的[:CvsRootHook:使用cvs来维护内容] 果然可行
- 但是非常的麻烦,而且要频率启动一个检测脚本来配合数据的同步...
- 使用 SVN 作为主要的版本管理系统后,当然的也想同理进行,有版本控制的内容维护!
研究
SVN 有hook 嘛?怎么使用?
看书先! [http://svnbook.red-bean.com/ 《使用Subversion进行版本控制》]的在线主页
- 嗯嗯!果然不出所料,有!
[http://www.subversion.org.cn/svnbook/1.1/svn-ch-5-sect-2.html#svn-ch-5-sect-2.1 钩子脚本]
- 看样子SVN没有玩太多的事务,就明晰的分了五种:
- start-commit 提交前触发事务
- pre-commit 提交完成前触发事务
- post-commit 提交完成时触发事务
- pre-revprop-change 版本属性修改前触发事务
- post-revprop-change 版本属性修改后触发事务
实现
那未我只是要自动的将所有的指定更新同步到目标中
当然是 post-commit ! {{{#/path/to/u/SVNrepo/hooks/post-commit.tmpl
... REPOS="$1" REV="$2"
#commit-email.pl "$REPOS" "$REV" [email protected] #log-commit.py --repository "$REPOS" --revision "$REV" ... }}}
- 按照说明,只要将 post-commit.tmpl 重命名为 post-commit SVN 就可以运行了!
- 但是! log-commit.py遍查不到,可以看到的 mailer.py 也大量调用 subversion-python-1.1.3::svn 模块,实在不明白
好容易 看到[http://svn.collab.net/repos/svn/branches/1.2.x/contrib/hook-scripts/commit-block-joke.py commit-block-joke.py] 比较简单,但是怎么也不调用?!
最终还是要[http://svn.haxx.se/users/archive-2006-01/0349.shtml 问列表]
才知道原来是文档没有看透:
由于安全原因,Subversion版本库在一个空环境中执行钩子脚本—就是没有任何环境变量, 甚至没有$PATH或%PATH%。 由于这个原因,许多管理员会感到很困惑,它们的钩子脚本手工运行时正常, 可在Subversion中却不能运行。 要注意,必须在你的钩子中设置好环境变量或为你的程序指定好绝对路径。
有简单的合理测试方式:
$ env - ./post-commit /var/lib/svn-repos 1234
这样一来果然快速调整好调用关系:
... HOOKS="/path/to/u/svnrepo/hooks/script" $HOOKS/post-commit.py "$REPOS" "$REV"
以Pythonic 的精神快速组织一下子:
1 #!/usr/local/bin/python 2 #coding=utf-8 3 import sys,os,time 4 LOOK = "/usr/local/bin/svnlook" 5 SVN = "/usr/local/bin/svn" 6 LOGFILE = "/path/to/u/hooks/log/post-commit.log" 7 f = open( LOGFILE, "a+" ) 8 TSTAMP = "%s"%time.strftime("%y-%m-%d %H:%M:%S", time.localtime()) 9 def autoco(dirs,svn,mark,aim,mod): 10 """自动检出指定项目的代码到指定目录 11 - dirs 本次修改了的目录 12 - svn svn 命令所在地 13 - mark 匹配项 14 - aim 输出目标 15 - mod 检出的模块 16 要求目标路径有预先检出的环境! 17 """ 18 if mark in dirs: 19 print >> f,TSTAMP+" %s marked::%s >>>> updating..."%(("+"*7),mark) 20 upsvn = svn+" update %s"%(aim+mod) 21 print >> f,TSTAMP+" "+"+"*7 22 up = os.popen(upsvn).read().strip() 23 print >> f,up 24 else: 25 print >> f,TSTAMP+" -------- marked null >>> update::nothing" 26 def changedirs(look,rev,repos): 27 """使用 svnlook 得到修改的路径 28 """ 29 dirs = os.popen( LOOK+" changed -r "+ rev + " " + repos).read().strip() 30 return dirs 31 def usage(): 32 print "Usage: " + sys.argv[0] + " REPOS REV\n" 33 print >> f,TSTAMP+"Usage: " + sys.argv[0] + " REPOS REV" 34 sys.exit(0) 35 if __name__ == '__main__': 36 if len(sys.argv) != 3: 37 usage() 38 repos = sys.argv[1] 39 rev = sys.argv[2] 40 print >> f,TSTAMP+" repos::"+repos+" rev::"+rev 41 ## Blog事务 42 autoco(changedirs(LOOK,rev,repos),SVN 43 ,"pyblosxom" 44 ,"/path/to/ur/pyblosxom" 45 ,"")
关键就是:一切都使用绝对路径!
小结
原理都非常简单,但是实施时要时刻保持清醒!
- 基本的行动路线:
- 准备 hooks
- 安装调试
部属目标工作复本!FootNote(此处有个小遗留问题:权限! 聪明的你一定知道怎么修正的哪!-))
- 提示,注意先后顺序,否则会造成版本冲突,而没有将目标文件同步!
- 本地加入内容模块,追加到SVN中,并提交
- 增加hooks 处理,确定事务处理
- 服务器端,检出工作复本
- 开始透过 SVN 进行内容维护!
- 提示,注意先后顺序,否则会造成版本冲突,而没有将目标文件同步!
- 邮件列表实在伟大,让全球任何地方的人可以分享体验!