svn 钩子开启

标签: 工作日志 | 发表时间:2017-04-24 17:24 | 作者:
出处:https://my.oschina.net/pwd

svn 钩子开启

背景: 公司的Svn很多人在用,有不少人在作修改后不添加注释,所以需要强制用户填写注释。 操作:

  1. 重命名svn主目录中hooks的pre-commit.tmpl文件为pre-commit,并添加可执行权限
  mv pre-commit.tmpl pre-commit
chmod u+x pre-commit
  1. 编辑pre-commit文件
  export LANG="zh_CN.UTF-8"
REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
#$SVNLOOK log -t "$TXN" "$REPOS" | \
# grep "[a-zA-Z0-9]" > /dev/null || exit 1

commit_type=$(svnlook changed -t "$TXN" "$REPOS")
#以下后缀可以不填写注释
except_list=".txt,.docx,.doc,.xls,.xlsx,.ppt,/"
num=0
for i in $(echo -e "$except_list" |sed "s/,/\n/g")
do
    sum=$(echo -e "$commit_type" |grep "$i$" |wc -l)
    if test[ $sum -ne 0 ];then
        num=$(expr $num + 1 )
    fi
done
total=$(echo -e "$commit_type" |wc -l)

if test[ $num -eq $total ];then
    exit 0
fi

$SVNLOOK log -t "$TXN" "$REPOS" > /tmp/aaa.txt

#强制用户提交注释,注释格式要求:bug/task+数字(任务数字编号)+注释(大于10)
TEMP_LENGTH=`$SVNLOOK log -t "$TXN" "$REPOS"|sed 's/\s*$//g'|sed 's/^\s*//g'| wc --chars` # 获取字符数量(包括换行符)
TEMP_LINE=`$SVNLOOK log -t "$TXN" "$REPOS"| wc --lines` # 统计换行符
LOGMSG_LENGTH=`expr $TEMP_LENGTH - $TEMP_LINE` # 真实字符数量
task=$( $SVNLOOK log -t "$TXN" "$REPOS" |grep "^task\-[0-9]*[0-9]\-" |wc -l )
bug=$( $SVNLOOK log -t "$TXN" "$REPOS" |grep "^bug\-[0-9]*[0-9]\-" |wc -l )
emrg=$( $SVNLOOK log -t "$TXN" "$REPOS" |grep "^emrg\-[0-9]*[0-9]\-" |wc -l )
getlaststring=$($SVNLOOK log -t "$TXN" "$REPOS"|grep -o "^task\-[0-9]*[0-9]\-\|^bug\-[0-9]*[0-9]\-\|^emrg\-[0-9]*[0-9]\-")
content=$($SVNLOOK log -t "$TXN" "$REPOS"|sed 's/\s*$//g'|sed 's/^\s*//g')

if test[ $LOGMSG_LENGTH -eq 0 ];then
    echo "【注释】$content" 1>&2
    echo "【注意】注释不能为空,请重新填写注释!!!" 1>&2
    echo "【格式】:bug/task/emrg-数字任务编号-注释(大于10)" 1>&2
    exit 1
fi

if test[ $task -eq 0 && $bug -eq 0 && $emrg -eq 0 ];then
    echo "【注释】$content" 1>&2
    echo "【注意】注释必须以bug或者task开头,后面加-和数字编号,请重新填写注释!!!" 1>&2
    echo "【格式】:bug/task/emrg-数字任务编号-注释(大于10)" 1>&2
    exit 1
fi

commemt=$($SVNLOOK log -t "$TXN" "$REPOS"|sed 's/\s*$//g'|sed 's/^\s*//g'|sed "s/^$getlaststring//g"| wc --chars)
commemt_line=$($SVNLOOK log -t "$TXN" "$REPOS" |sed "s/^$getlaststring//g"|wc --lines)
commemt_length=$( expr $commemt - $commemt_line)

if test "$commemt_length" -lt 10 ;
then
    echo "【注释】$content" 1>&2
    echo "【注意】注释必须超过10个字符,请重新填写注释!!!" 1>&2
    echo "【格式】:bug/task/emrg-数字任务编号-注释(大于10)" 1>&2
    exit 1
fi


# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
#commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

# All checks passed, so allow the commit.
exit




一、问题

  * pre-commit等钩子有做一些检查,如果有问题就echo错误信息,但出错信息是中文的,svn客户端无法显示,提示如下

Error output could not be translated from the native locale to UTF-8.

我们尝试过以下方法,但都没有解决

  • 修改pre-commit的编码,修改LANG
  export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
  • 修改Apache的编码
  AddDefaultCharset UTF-8
  • 采用http发布,而不是https

结论:网上的解决方案只对 svn://这种直接用svnserve发布出来的仓库才有效

二、 解决方案

Subversion 1.8特性

SVNUseUTF8 On

它的作用就是使得Apache的mod_dav_svn模块,在和pre-commit等钩子通讯的时候,使用utf-8编码,可以参考mod_dav_svn

升级

我们系统是CentOS 6.2,比较简单,有个第三方,走了Subversion 1.8的rpm包,yum即可,主要是更新了2个rpm包

  * subversion-1.8.15-1.x86_64
* mod_dav_svn-1.8.15-1.x86_64

具体升级操作

  cat > /etc/yum.repos.d/wandisco-svn.repo <<EOF

[WandiscoSVN]

name=Wandisco SVN Repo

baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/\$basearch/

enabled=1

gpgcheck=0

EOF



yum install subversion -y

修改httpd.conf并重启httpd

  <IfModule mod_dav_fs.c>

    # Location of the WebDAV lock database.

    DAVLockDB /var/lib/dav/lockdb

    SVNUseUTF8 On

</IfModule>

/etc/init.d/httpd graceful

升级后的测试

需要做些测试,确保升级后不会有问题,测试列表如下

  * commit
* update
* log
* merge
* copy签出版本

注意问题:

服务器版本是1.8,如果客户端是1.6,则只能checkout,不能update,1.7没有问题,建议客户端至少1.8

相关 [svn 子开] 推荐:

svn 钩子开启

- - 运维技术的个人空间
背景: 公司的Svn很多人在用,有不少人在作修改后不添加注释,所以需要强制用户填写注释. 重命名svn主目录中hooks的pre-commit.tmpl文件为pre-commit,并添加可执行权限. echo "【注释】$content" 1>&2. echo "【注意】注释不能为空,请重新填写注释!!!" 1>&2.

SVN强制填写日志

- - CSDN博客系统运维推荐文章
在F:\Repositories\版本库名\hooks下新建pre-commit.bat. rem 保证输入8个字符 %SVN_BINDIR%\svnlook log %REPOS% -t %TXN% | findstr "........" > nul if %errorlevel% gtr 0 goto :err_action rem 过滤空格字符 %SVN_BINDIR%\svnlook log %REPOS% -t %TXN% | findstr /ic:".

SVN之使用原则

- - 研发管理 - ITeye博客
以下是我起草的部门SVN规范里原则的一部分. 必须提交注释,注明相关修改信息,例如bug号、任务描述等. 具体内容可采用约定或者设置的形式. 你所提交的改变将体现给其他开发者,要明白提交的后果,. 代码变动及时提交,避免丢失本地修改后无法恢复. 新增加的文件同时被提交,否则只在你本地能正常工作,导致其它人不能编译通过.

使用VisualSVN Server搭建SVN服务器

- - CSDN博客推荐文章
使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和 Apache相配合来实现源代码的 SVN管理简单的多,上手也没有那么复杂. VisualSVN Server的下载地址如下,是免费的,随意不必有顾虑. 1使用SVN,首先要安装 TortoiseSVN,就是上面的SVN下载地址.

SVN:合并一个分支到主干

- - P.Linux Laboratory
本文内容遵从 CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/program/svn_merge_branch_trunk.html. 原文在此,我只是翻译: http://www.sepcot.com/blog/2007/04/SVN-Merge-Branch-Trunk.

[原]强制 code review:reviewboard+svn 的方案

- - 赖勇浩的编程私伙局
赖勇浩( http://laiyonghao.com). 我们团队在开发《天下盛境》项目的时候,制定和执行了比较好的 code review 策略,总结下来有几个优点:一是代码风格可控,代码质量有一定提升;二是新员工入职后能够得到更多人的指导,成长非常快;三是小 bug 频出的情况比我做《天》之前的项目少了至少一个数量组.

SVN提交更新的一个准则

- - BlogJava_首页
查阅了一下网络和博客园,发现还没有一个明确地指导源码管理提交准则的相关文章,因此斗胆整理了一部分自己平时开发管理的心得,加上查阅了部分英文资料写了一个不算很完善的SVN提交准则. 负责而谨慎地提交自己的代码. SVN更新的原则是要随时更新,随时提交. 当完成了一个小功能,能够通过编译并且并且自己测试之后,谨慎地提交.

SVN:分支合并到主干

- - CSDN博客系统运维推荐文章
1.先把主干代码下载到本地. 3.svn merge 分支目录    . 4.遇到冲突, 请见合并日志,选择"p",记下出冲突的文件,人工编辑.  4.1 比如Index.action出冲突了,vi Index.action.  4.2 vi完成以后,删除冲突的文件 rm -f Index.action.*.

svn提交时强制注释

- -
不少开发员提交修改的时候都不写注释,导致查看历史时很费劲,也不太符合规范. 有的公司要求每次提交修改时都写上bug号或者任务描述,那么如何在工具上防止开发员们不写注释呢.   利用svn的pre-commit钩子可简单实现此要求. 进入仓库project1/hooks目录,找到pre-commit.tmpl文件,重命名,去掉后缀.tmpl.

SVN下最高效打基线方法

- - CSDN博客推荐文章
作者:张克强    作者微博: 张克强-敏捷307. 组织级scm建一个名为controlled的目录,当项目某文档通过评审后,组织级scm从项目目录下找到那文档,复制到controlled目录下. 请@scmeye软件配置管理社区 @E路向前--李忠利 @火星人陈勇 点评下这做法. 邱润HW:有什么东西是可以完全被控制的吗.