钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!
下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。
一.服务器后台管理命令
1.svnlook
1)svnlook author
可跟选项
--revision (-r)
--transaction (-t)
打印版本库一个修订版本或者事物的作者。
svnlook author -r 40 /usr/local/svn/repos
2)svnlook cat
打印一个文件的内容
svnlook cat REPOS_PATH PATH_IN_REPOS
可跟选项
--revision (-r)
--transaction (-t)
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README
svnlook cat -r 40 /usr/local/svn/repos /trunk/README
3)svnlook changed
打印修改的路径。
svnlook changed REPOS_PATH --最后一次修改
svn update样式的”状态字符:
'A '----条目添加到版本库。
'D '----条目从版本库删除。
'U '----文件内容改变了。
'_U'----条目属性改变了。
'UU'----文件内容和属性修改了。
文件和目录可以区分,目录路径后面会显示字符'/'。
可跟选项
--revision (-r)
--transaction (-t)
svnlook changed -r 39 /usr/local/svn/repos
4)svnlook date
$ svnlook date -r 40 /tmp/repos/
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
5)svnlook diff
svnlook diff REPOS_PATH
可跟选项
--revision (-r)
--transaction (-t)
--no-diff-added
--no-diff-deleted
$svnlook diff -r 40 /usr/local/svn/repos/
Copied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)
Added: trunk/vendors/deli/soda.txt
==============================================================================
Modified: trunk/vendors/deli/sandwich.txt
==============================================================================
--- trunk/vendors/deli/sandwich.txt (original)
+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -0600
@@ -0,0 +1 @@
+Don't forget the mayo!
Modified: trunk/vendors/deli/logo.jpg
==============================================================================
(Binary files differ)
Deleted: trunk/vendors/deli/chips.txt
==============================================================================
Deleted: trunk/vendors/deli/pickle.txt
==============================================================================
如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。
6)svnlook dirs-changed
打印本身修改的目录
svnlook dirs-changed REPOS_PATH
可跟选项
--revision (-r)
--transaction (-t)
$svnlook dirs-changed -r 40 /usr/local/svn/repos
trunk/vendors/deli/
7)svnlook history
打印版本库(如果没有路径,则是根目录)某一个路径的历史。
可跟选项
--revision (-r)
--show-ids
$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids
REVISION PATH <ID>
-------- ---------
19 /tags/1.0 <1.2.12>
17 /branches/1.0-rc2 <1.1.10>
16 /branches/1.0-rc2 <1.1.x>
14 /trunk <1.0.q>
13 /trunk <1.0.o>
11 /trunk <1.0.k>
9 /trunk <1.0.g>
8 /trunk <1.0.e>
7 /trunk <1.0.b>
6 /trunk <1.0.9>
5 /trunk <1.0.7>
4 /trunk <1.0.6>
2 /trunk <1.0.3>
1 /trunk <1.0.2>
8)svnlook info
打印作者、时间戳、日志信息大小和日志信息。
svnlook info REPOS_PATH
可跟选项
--revision (-r)
--transaction (-t)
$ svnlook info -r 40 /usr/local/svn/repos
sally
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
15
Rearrange lunch.
9)svnlook lock
打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。
这描述了文件tree.jpg的锁定。
$ svnlook lock /svn/repos /trunk/tree.jpg
UUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda813329753
Owner: harry
Created: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)
Expires:
Comment (1 line):
Rework the uppermost branches on the bald cypress in the foreground.
10)svnlook log
打印日志信息。
svnlook log REPOS_PATH
--revision (-r)
--transaction (-t)
例子
这显示了实例版本库在修订版本40的日志输出:
可跟选项
--revision (-r)
--transaction (-t)
$ svnlook log /tmp/repos/
Rearrange lunch.
11)svnlook tree
打印树。
svnlook tree REPOS_PATH [PATH_IN_REPOS]
打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。
可跟选项
--revision (-r)
--transaction (-t)
--show-ids
12)svnlook youngest
打印最年轻的修订版本号。
这显示了在实例版本库显示最年轻的修订版本:
$ svnlook youngest /tmp/repos/
42
2.svnadmin
1)svnadmin hotcopy — 制作一个版本库的热备份。
svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH
2)svnadmin dump — 将文件系统的内容转储到标准输出。
svnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。
这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。
然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,
也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。
转储整个版本库:
$ svnadmin dump /usr/local/svn/repos
SVN-fs-dump-format-version: 1
Revision-number: 0
* Dumped revision 0.
Prop-content-length: 56
Content-length: 56
…
从版本库增量转储一个单独的事务:
$ svnadmin dump /usr/local/svn/repos -r 21 --incremental
* Dumped revision 21.
SVN-fs-dump-format-version: 1
Revision-number: 21
Prop-content-length: 101
Content-length: 101
…
二.hooks简介
钩子脚本在每个repos的hooks目录下面。
每个里面都有模板,名字如下:
post-commit.tmpl post-revprop-change.tmpl pre-commit.tmpl pre-revprop-change.tmpl start-commit.tmpl
post-lock.tmpl post-unlock.tmpl pre-lock.tmpl pre-unlock.tmpl
下面对每个钩子的功用 做一个说明!
1)start-commit — 开始提交的通知
描述
start-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。
如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.认证过的尝试提交的用户名
3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).
2)pre-commit — 在提交结束之前提醒。
描述
pre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。
如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.提交事务的名称
3)post-commit — 成功提交的通知。
描述
post-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。
如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.提交创建的修订版本号
4)pre-revprop-change — 修订版本属性修改的通知。
描述
pre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。
如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.要修改属性的修订版本
3.企图修改属性的认证用户名
4.属性名称已修改
5.变更描述:A (添加的),D (删除的)或M (修改的)
此外,Subversion 通过标准输入将属性的新值传递给钩子程序。
5)post-revprop-change — 修订版本属性修改成功的通知
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.经修改属性的修订版本
3.做出修改的认证用户名
4.属性名称已修改
5.变更描述:A (添加的),D (删除的)或M (修改的)
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。
6)post-revprop-change — 修订版本属性修改成功的通知
描述
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.已经修改属性的修订版本
3.做出修改的认证用户名
4.属性名称已修改
5.变更描述:A (添加的),D (删除的)或M (修改的)
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。
7)post-lock — 成功锁定路径的通知。
描述
post-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。
如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.锁定路径的认证用户名
此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。
8)pre-unlock — 路径解锁尝试的通知。
描述
pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。
如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.Versioned path which is to be unlocked
3.Authenticated username of the person attempting the unlock
9)post-unlock — 路径成功解锁的通知。
描述
post-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。
如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.路径解锁的认证用户名
此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。
三.hooks本应用demo
就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。
1.如果不想开发人员有删除权限,只有SCM用户有删除权限...
#############################################
REPOS="$1"
TXN="$2"
RES="OK"
USER=`svnlook author -t $TXN $REPOS`
SCMLIST="user1,user2,user3" #scm人员列表
if [ `echo $SCMLIST|grep -w $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断
then
SVNLOOK=/usr/bin/svnlook
LOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]
then
echo -e "\n You Don't have the pemmision of delete " 1>&2
exit 1
fi
fi
#############################################
2.提交完毕邮件通知
http://bbs.scmlife.com/thread-14543-1-1.html
见此帖子
3.增量备份
4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件
pre-commit
###############################
REPOS="$1"
TXN="$2"
RES="OK"
st="k2/branch/BR-K2-1_0_001_20100316/"
ABSUSER=$($SVNLOOK author $REPOS -t $TXN)
if [ $ABSUSER != "ads" ]
then
if [ "`echo $files|grep $st`" = "$files" ]
then
echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2
exit 1
fi
fi
exit 0
###############################
自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。
5.钩子脚本 对锁的管理
http://bbs.scmlife.com/viewthread.php?tid=14991&highlight=%2Bgo2cxg
见这个帖子 有详细的说明。
6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)
pre-commit
########################################
REPOS="$1"
TXN="$2"
RES="OK"
MAX_SIZE=10240000
files=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')
for f in $files
do
filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)
if [ $filesize -gt $MAX_SIZE ] ; then
echo "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr
exit 1
fi
done
########################################
当然 这里还可以做一些其他的限制
比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制
分享到:
相关推荐
1. 将`pre-commit.bat`或`pre-commit.exe`放置在SVN服务器的`hooks`目录下。 2. 确保脚本有执行权限。 3. 根据项目需求,编辑脚本内容,定义需要在提交前执行的操作。 4. 测试钩子,确保它按预期工作,并不会阻断...
在SVN仓库的`hooks`目录下创建`pre-commit`脚本: ```bash [root@localhost conf]# cd /var/www/repos/testsvnproj/hooks/ [root@localhost hooks]# vi pre-commit ``` 脚本示例内容: ```bash #!/bin/sh REPOS=...
例如,`pre-commit` 脚本会在提交之前执行,而 `post-commit` 脚本则在提交之后运行。这些脚本为管理员提供了额外的灵活性,以便根据项目的需求自定义SVN的行为。 #### 三、pre-commit脚本的作用 pre-commit 脚本...
用法:将本bat文件(不可改名)存在svn服务器端安装目录\仓库名\hooks下(该目录下有多个*.tmpl文件,包括pre-commit.tmpl即linux下的提交钩子,而pre-commit.bat为windows下的提交钩子),并修改文件中相应目录(共...
(1)在网上看了很多方案,类似于 在 hooks文件的 post-commit 文件中增加 || exit1 exit0;这种方案试过之后并没有解决问题; (2)最终解决方案,找到post-commit 文件的第52行,并把相应内容注释掉,问题得到了...
这些操作称为 Hook SCRIPT,其中包括 pre-commit、post-commit、pre-update、post-update 等多种类型的 Hook,每种 Hook 都有其特定的用途和执行时机。 在 Subversion 中,pre-commit Hook 是在客户端提交事务之前...
windows环境svn服务器,提交限制文件大小脚本,pre-commit.bat,限制大小为byte
标题“post-commit.rar”指的是一个与版本控制系统Subversion(简称SVN)相关的压缩包文件,其中包含用于自动化操作的脚本和配置。这个压缩包很可能是一个示例或模板,用于在执行提交操作后触发特定的行动,比如发送...
通常,hooks 脚本位于 SVN 仓库的 `hooks` 目录下,每种类型的 hook 都有一个对应的脚本文件,如 `pre-commit.sample`、`post-commit.sample` 等。你需要根据自己的需求修改这些样本脚本,然后去掉 `.sample` 扩展名...
配置VisualSVN时设置pre-commit要求输入说明
SVN服务端(VisualSVN-Server-3.9.0-x64) SVN服务端(VisualSVN-Server-3.9.0-x64) 直接使用
`commit-email.pl` 是一个Perl脚本,通常作为SVN服务器的post-commit钩子,当用户提交代码到SVN仓库后,该脚本会被触发,然后自动发送一封包含提交详情的邮件给指定的收件人。这不仅提高了团队协作效率,也确保了...
在“svn-win32-1.4.6.zip”这个压缩包中,我们可以看到的是适用于Windows操作系统的SVN客户端版本1.4.6。 1. **SVN的原理**: SVN基于集中式版本控制模型,所有的版本信息存储在一个中央服务器上,开发者通过...
maven git commit id plugin git-commit-id-plugin is a plugin quite similar to ...
将文件解压缩到 C:\ 下,将解压缩后的 svn-win32-1.7.2 文件夹名改为 svn,然后将 C:\svn\bin 加入到系统的 PATH 环境变量中,即可开始使用。 将 svnserve.exe 设置为系统服务: sc create svn binpath= "C:\svn\...
SVN提交时必须写说明,说明少于10个字符则提交失败 把改文件放在SVN的hooks目录下,并修改一些文件里的路径即可
在本文中,我们将深入探讨Eclipse SVN插件(svn-site-1.6.17)及其相关组件,以帮助您更好地理解和使用这个强大的版本控制系统。 首先,Eclipse SVN插件提供了图形化的用户界面,使得用户可以方便地进行版本控制...
【标题】"SVN-x64-svn-2017-10-31 104600_Hcs.zip"所指的是一个64位版本的Subversion(SVN)软件的压缩包,发布于2017年10月31日,版本号为104600,由Hcs提供。这个压缩包中包含了一个名为"SVN-x64-svn-2017-10-31 ...
在windows环境下,提交代码到svn中,使用钩子脚本,获取项目名称,提交人,提交时间,提交的日志信息,版本号,纯bat脚本。ps:不是pre-commit.bat文件,因为在该文件中获取不到真正的版本号。
将文件解压缩到 C:\ 下,将解压缩后的 svn-win32-1.7.0 文件夹名改为 svn,然后将 C:\svn\bin 加入到系统的 PATH 环境变量中,即可开始使用。 将 svnserve.exe 设置为系统服务: sc create svn binpath= "C:\svn\...