SVN 有哪些常见和/或有用的预提交钩子?
22 回答
用户实际上已经在提交消息上输入了评论,并且它包含要跟踪的特定问题编号。
检查各种文本文件(即 VRML、XML 等)中的绝对路径。大多数签入代码不应该有绝对路径,但有些人和工具坚持生成硬编码的东西。
我对提交消息进行字数统计。他们需要5个字或更多。这导致了一些对我的喜剧侮辱......
- 检查标签并拒绝签入。
- 检查不一致的行尾并拒绝签入。
- 检查是否出现“CR:[用户名]”,如果没有代码审查,则拒绝签入。
您可能想看看: http: //svn.apache.org/repos/asf/subversion/branches/1.6.x/www/tools_contrib.html#hook_scripts(此页面可能已过时,显然不再维护对于颠覆 1.7)
或直接在: https ://svn.apache.org/repos/asf/subversion/trunk/contrib/
我喜欢使用svn
钩子:
- 执行更严格的代码风格点
- 检查明显的语法错误
- 确保像“Fixes”或“Addresses”这样的特殊 Trac 关键字实际上位于相应的问题编号之前
我们有一个 post commit hook 可以将消息发布到 Twitter 帐户。使用twitsvn(免责声明:我是该项目的提交者)。
愚蠢的?也许......但事实证明,它是我们将存储库的进展情况传达给我们的一些版本控制挑战的团队成员的好方法。一旦 SVN 开始通过他们的 twitter 客户端与他们交谈,它就不再像一个黑匣子了。
我检查文件类型并确保某些被禁止的类型不是偶然提交的(例如.obj、.pdb)。好吧,自从有人第一次签入 2 gig 的编译器生成的临时文件以来就没有了 :(
对于窗户:
@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
我使用提交后挂钩将作者属性重写为来自 ldap 树的友好名称。(身份验证使用员工ID)
我们存档中的一个很棒的提交钩子是检查所有 .VCPROJ(或 .CSPROJ)Visual Studio 项目,以确保输出目录没有更改为本地的任何内容(通常用于调试)。
这些问题将正确编译,但仍会因为缺少可执行文件而中断构建。
在我目前工作的公司中,对此进行了检查:
- 如果二进制文件设置了需要锁属性;
- Java 文件是否有标准版权声明并且是否包含当前年份;
- 如果代码格式正确(我们使用 Jalopy 进行代码格式化)——这可能听起来很傻,但它实际上使不同版本之间的文本比较更容易;
- 如果代码有提交信息;
- 如果目录结构符合定义(所有项目都应该在一个定义好的SVN文件夹下,并且每个项目应该有一个tags、branch和trunk文件夹);
我想就是这样。
我喜欢检查提交是否与票证相关联的想法;这对我来说真的很有意义。
有些人更喜欢为给定的语言运行类似 lint 的工具,以发现代码中的常见问题和/或强制编码风格。然而,在一个小型且技术娴熟的团队中,我更愿意让每个提交都通过并处理持续集成和/或代码审查期间可能出现的问题。由于这种提交速度更快,这鼓励了更频繁的提交,从而更容易集成。
I use the check-mime-type.pl pre-commit hook to check that MIME Type and End of line options are set on committed files. I use subversion to publish files to be visible on a website using DAV, and all files without the MIME Type set get served as text files (e.g. HTML source gets displayed in a browser instead of the rendered markup).
我们使用 pre-commit 和 post-commit 钩子组合来自动更新 bugzilla 与来自 svn 提交的相关条目。
我们使用第二个(预提交)挂钩来确保在将文件添加到存储库之前在文件上设置适当的 svn:eol-style 和 svn:keywords 属性。
我们有第三个(提交后)钩子来启动构建并在构建损坏时邮寄结果,并在构建再次修复时通知所有人。
我们有第四个(提交后)挂钩来启动 svn 复制,以确保异地复制尽可能是最新的。
不幸的是,我无法发布这些源代码,但是,除了 Bugzilla 集成之外,它们很容易实现,Hudson可能是持续集成的更好选择。
对于 bugzilla 集成,我建议查看scmbug。
根据通过 RegEx 具有“问题 #”等的提交消息,在 Mantis 错误跟踪器中插入一条带有更改列表详细信息的注释。
它有一个提交消息,它是 != 而不是“错误修复”。该死,我讨厌那些无用的信息吗!
我使用下面的钩子脚本来确保源代码的行尾和 shell 脚本的权限是正确的(当有人在 Windows 上签入而一切似乎都正常并破坏了 unix 构建时,这是令人沮丧的)。
#!/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。这样可以确保没有人检查无法编译的代码!:)
我检查大小写冲突(愚蠢的窗口)并且还需要-mergeinfo.pl 以确保客户端至少为 1.5 - 这样 svn:mergeinfo 将始终设置
使用 PostUpdate 和 PreCommit 解决 SVN 1.5 中缺少文件外部的问题
我正在考虑写一个来检查 doctype's on aspx / html 文件,只是为了确保每个人都使用正确的。
此外,您可以使用前(或后)提交挂钩将通知推送到您的 CI 服务器,如 Hudson 博客中所述
我喜欢检查提交消息中的 [Reviewer: xyz] 注释并拒绝提交的钩子。