分享共同/有用的SVN预先提交钩子
什么是SVN的一些常见和/或有用的预提交钩子?
我们有一个提交后挂钩,将消息发布到Twitter帐户。 使用twitsvn (免责声明:我是该项目的提交者)。
愚蠢? 也许…但事实certificate,这是我们向我们的一些版本控制挑战的团队成员传达我们的信息库的好方法。 一旦SVN通过他们的twitter客户端与他们交谈,就不会像黑匣子那样。
用户实际上已经对提交消息进行了评论,并且包含要跟踪的特定问题编号。
检查各种文本文件(如VRML,XML等)中的绝对path。 大多数签入的代码不应该有绝对path,但一些人和工具坚持生产硬编码的东西。
我在提交消息上写了一个字。 他们需要5个字或更多。 这导致了一些对我的喜剧侮辱…
- 检查标签并拒绝签入。
- 检查不一致的行结束并拒绝签入。
- 检查是否出现“CR:[用户名]”,如果没有代码审查,则拒绝登记。
你可能想看看: http : //svn.apache.org/repos/asf/subversion/branches/1.6.x/www/tools_contrib.html#hook_scripts (这个页面可能已经过时了,显然它不再被维护了对于Subversion 1.7)
或直接在: https : //svn.apache.org/repos/asf/subversion/trunk/contrib/
我喜欢使用svn
钩子来:
- 强制执行更严格的代码风格
- 检查明显的语法错误
- 确保像“修复”或“地址”这样的特殊Trac关键字实际上在适当的问题编号之前
我检查文件types,并确保某些禁止的types不是偶然发生(如.obj,.pdb)。 那么,不是从第一次有人检查2演出编译器生成的临时文件:(
对于Windows:
@echo off svnlook log -t "%2" "%1" | c:\tools\grep -c "[a-zA-z0-9]" > nul if %ERRORLEVEL% NEQ 1 goto DISALLOWED echo Please enter a check-in comment 1>&2 exit 1 :DISALLOWED svnlook changed -t %2 %1 > c:\temp\pre-commit.txt findstr /G:"%1\hooks\ignore-matches.txt" c:\temp\pre-commit.txt > c:\temp\precommit-bad.txt if %ERRORLEVEL% NEQ 0 exit /b 0 echo disallowed file extension >> c:\temp\precommit-bad.txt type c:\temp\precommit-bad.txt 1>&2 exit 1
我使用post-commit挂钩将作者属性重写为我们的ldap树中的友好名称。 (身份validation与员工ID)
在我们的归档中,一个很好的提交钩子是检查所有的.VCPROJ(或.CSPROJ)visual studio项目,以确保输出目录不会被更改为本地任何东西(通常用于debugging)。
这些问题将会正确编译,但仍会因为缺less可执行文件而破坏构build。
在我目前正在工作的公司,这是检查:
- 如果二进制文件具有需要locking属性设置;
- 如果Java文件具有标准的版权声明,并且包含当前年份;
- 如果代码格式正确(我们使用Jalopy进行代码格式化) – 这可能听起来很愚蠢,但它实际上使不同版本之间的文本比较更容易;
- 如果代码有一个提交消息;
- 如果目录结构符合所定义的(所有项目都应该在一个定义的SVN文件夹下,每个项目应该有一个标签,分支和中继文件夹);
我想就是这样。
我喜欢检查提交是否与票证关联的想法; 这实际上对我来说很有意义。
有些人更喜欢运行一种给定语言的类似lint的工具来查找代码中的常见问题和/或强制编码风格。 然而,在一个小而熟练的团队中,我倾向于允许每一个承诺在持续集成和/或代码审查过程中处理可能的问题。 由于这个提交更快,提高了更频繁的提交,导致更容易的集成。
我使用check-mime-type.pl pre-commit挂钩来检查提交的文件上是否设置了MIMEtypes和行结束选项。 我使用颠覆来发布文件,以使用DAV在网站上可见,并且没有MIMEtypes集的所有文件都被作为文本文件(例如,HTML源代码在浏览器中显示,而不是呈现的标记)。
在Mantis bugtracker中插入一个注释,其中包含基于提交信息包含“issue#”或类似内容的更改列表详细信息。
它有一个提交消息,它比“修正错误”更难! 该死的,我恨那些无用的消息!
我们使用pre-commit和post-commit hook组合来自动更新bugzilla和svn commit中的相关条目。
我们使用第二个(pre-commit)挂钩来确保在文件被添加到repostitory之前,在文件上设置适当的svn:eol-style和svn:keywords属性。
我们有第三个(提交后)钩子来启动一个构build,并在构build失败时邮寄结果,并在构build被再次修复时通知每个人。
我们有第四个(提交后)钩子启动svn复制,以确保非现场复制尽可能最新。
不幸的是,我不能发布这些源代码,但除了Bugzilla集成之外,它们很容易实现, 哈德森可能是持续集成的更好select。
对于bugzilla整合,我build议看看scmbug 。
我使用下面的钩子脚本来确保源代码和shell脚本的权限的行结束是正确的(当一切看起来好的时候有人在窗口签入并打破了Unix的构build,这是令人沮丧的)。
#!/bin/bash REPOS="$1" TXN="$2" # Exit on all errors. set -e SVNLOOK=svnlook echo "`$SVNLOOK changed -t "$TXN" "$REPOS"`" | while read REPOS_PATH do if [[ $REPOS_PATH =~ A[[:blank:]]{3}(.*)\.(sh|c|h|cpp) ]] then if [ ${#BASH_REMATCH[*]} -ge 2 ] then FILENAME=${BASH_REMATCH[1]}.${BASH_REMATCH[2]}; # Make sure shell scripts are executable if [[ sh == ${BASH_REMATCH[2]} ]] then EX_VALUE="true" if [ -z "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:executable \"$FILENAME\" 2> /dev/null`" ] then ERROR=1; echo "svn ps svn:executable $EX_VALUE \"$FILENAME\"" >&2 fi EOL_STYLE="LF" else EOL_STYLE="native" fi # Make sure every file has the right svn:eol-style property set if [ $EOL_STYLE != "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:eol-style \"$FILENAME\" 2> /dev/null`" ] then ERROR=1; echo "svn ps svn:eol-style $EOL_STYLE \"$FILENAME\"" >&2 fi fi fi test -z $ERROR || (echo "Please execute above commands to correct svn property settings." >& 2; exit 1) done
如何钩编译项目? 例如运行make all。 这确保没有人检查不编译的代码! 🙂
使用PostUpdate和PreCommit解决SVN 1.5中缺lessFile Externals的问题
我喜欢在提交消息中检查[Reviewer:xyz]注释的钩子,并拒绝提交。
我正在考虑编写一个检查aspx / html文件的doctype,只是为了确保每个人都使用正确的。
此外,你可以有一个预(或后)提交钩按Hudson博客中所述将通知推送到您的CI服务器
我检查案件的冲突(愚蠢的窗口),并要求-mergeinfo.pl,以确保客户端至less1.5 – 这样svn:mergeinfo将始终设置