第二个Subversion预提交钩子失效,求问题原因分析
排查Subversion预提交钩子第二个检查逻辑未生效的问题
你好,我仔细看了你的预提交钩子脚本,发现第二个检查模块(Operation 002)有几个关键逻辑错误,这就是它没生效的原因,咱们逐个拆解:
核心问题分析
1. 遍历对象完全错误
你在Operation 002里用for PATH in $COMPARE循环,但$COMPARE是svnlook diff的完整输出——这是包含文件变更内容、diff符号、行号的文本,不是你需要的文件路径列表。这个循环根本没法正确匹配到path/to/look/at/only/*这个路径规则。
2. 提前退出导致后续检查终止
循环里的else exit 0;是致命问题:只要第一个遍历到的diff行不匹配目标路径,脚本就直接退出并返回成功状态,后面的所有内容都不会被检查。哪怕提交的文件里有符合路径且包含违规字符串的内容,脚本也已经提前结束了,自然不会触发拦截。
3. diff检查逻辑冗余且范围错误
你每次循环都重新执行一遍完整的svnlook diff,没有限定只检查目标路径下的文件,不仅效率低,还会导致非目标路径的文件也被扫描,但更关键的是前面的逻辑错误让这个检查根本没机会作用到正确的文件上。
修正后的Operation 002代码
把这部分逻辑改成先筛选目标路径下的变更文件,再逐个检查内容:
#Operation 002 Beginning #Restrict commits based on string found in file # 第一步:筛选出目标路径下的新增/修改文件 TARGET_CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A]" | $AWK '{print $2}' | $GREP "path/to/look/at/only/"` # 遍历目标路径下的变更文件 for PATH in $TARGET_CHANGED do # 检查当前文件的diff中是否包含指定字符串 $SVNLOOK diff -t "$TXN" "$REPOS" "$PATH" | egrep 'string1|string2|string3' > /dev/null && { echo "Cannot commit using string1, string2 or string3 in files under path/to/look/at/only/" 1>&2 exit 1 } done #Operation 002 Completed
额外检查点
除了代码逻辑,还要确认这两个常见问题:
- 脚本权限:确保预提交钩子脚本有可执行权限,执行
chmod +x pre-commit给脚本加上执行权限,Subversion要求钩子必须能被系统执行。 - 手动测试验证:可以直接手动运行脚本测试,比如用
./pre-commit /path/to/your/repo <transaction-id>,看看输出是否符合预期,这样能快速定位脚本的执行问题。
内容的提问来源于stack exchange,提问作者John Evans
相关产品推荐
相关产品推荐

