SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 41714|回复: 92

[原创] Hooks总结-从入门到精通~欢迎跟帖,提钩子脚本需求!

  [复制链接]
发表于 2010-6-30 16:43:00 | 显示全部楼层 |阅读模式
钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!
+ G8 L2 {0 z1 f; e7 D下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。+ }2 J. H' S- T$ k* ?6 K1 e1 h
欢迎大家跟帖~如果有新的hooks需求,请跟帖。大家一起来完成!
2 ^1 W; g6 i5 E5 @& d% \! e7 s有个前提,我觉得作为一个合格的SCM,还是有必要学点Shell或bat的写法。
+ B7 o/ n$ ^6 Z: \0 R/ s+ P所以对于看不明白钩子的同学,可以先学下Shell的基础知识。
* G& l. X/ H% m7 g2 x不然只是一个理论上的SCM。# u$ z! N& a; e+ R' t! g
谢谢大家!. j# Y! d1 S! t' n4 }
一.服务器后台管理命令
  F' P* Z9 O+ s" R1.svnlook
  C0 W" h6 w9 b) T  i8 x1)svnlook author ; X' f1 I" L  e+ j% T0 F
可跟选项* g% D$ o1 ]+ Z1 v+ @2 i
--revision (-r)
* n, L$ J, l7 R1 L" b* L--transaction (-t)
8 {7 U1 o9 V0 q+ I' {打印版本库一个修订版本或者事物的作者。
0 X  f6 n+ h% ?, o5 Vsvnlook author -r 40 /usr/local/svn/repos
" M$ t- ]  G9 A+ j/ G$ M
7 \" W1 A$ Y* G
3 Q+ L: s( t8 n( u0 s2)svnlook cat 1 ^$ m0 U; ^6 Y+ A3 R3 C4 r
打印一个文件的内容
5 \9 O1 i. w" I) H& A! O0 _svnlook cat REPOS_PATH PATH_IN_REPOS3 \6 o! @7 _) @' Z9 }9 i
可跟选项  q/ m  A" G. w  z3 ^2 c8 l9 Q% y
--revision (-r)
* d: [6 A4 {$ s/ U7 j. {--transaction (-t)7 ~& K3 M& p/ U! n
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README9 }% \7 u' k4 D
svnlook cat -r 40 /usr/local/svn/repos /trunk/README% v1 i( S8 x$ D. W3 l

6 {- m* G. k: n6 w% w: c- m3)svnlook changed- q! S2 S, ]* P/ ^3 A
打印修改的路径。# r$ j% }* L6 I3 S$ i! a3 {
svnlook changed REPOS_PATH --最后一次修改
* Q# w& S0 z; y: {& h  Gsvn update样式的”状态字符:) \6 V* N: d7 E
'A '----条目添加到版本库。! Q) A  Z3 ^+ d4 `) ^& w7 p+ M
'D '----条目从版本库删除。2 z2 V1 E5 v. i6 B! y% M
'U '----文件内容改变了。( U) R4 m( I5 _9 P8 @& P* E
'_U'----条目属性改变了。
0 {/ h, t- ?1 G) _6 l$ s& v'UU'----文件内容和属性修改了。
* \- T) B! O8 o" ?文件和目录可以区分,目录路径后面会显示字符'/'。 3 _# a1 c. ]# L6 v# I/ P
可跟选项" Q/ x+ b% X  B) R
--revision (-r)2 W9 h8 |5 l: b  u
--transaction (-t)8 ^' U" k1 g$ z2 I. p
svnlook changed -r 39 /usr/local/svn/repos3 \9 C* V7 d# d3 Y; P4 H( ^/ H& o5 b% G

! ]1 e* N- D! \) \! b5 m" g4)svnlook date+ o: J+ X& t; F: D8 b" R/ e% K* D
" B( t: r/ r' W  W! a8 p
$ svnlook date -r 40 /tmp/repos/1 W, A( T; O( }; z, @) R% q6 B
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)7 ^! m% ]) E4 T% S0 b  U! O3 T

7 {) ~8 T# y2 p$ Z- r& x5)svnlook diff  K; f( f6 S: T2 L8 I: k9 }  g7 C
svnlook diff REPOS_PATH
- D( k5 c9 z, C( [' [* p3 K0 U可跟选项; ^/ `, t: E* t- z' l
--revision (-r)' W, @; s( l+ R* i3 J
--transaction (-t)/ ^  [1 u* y6 y) K! D
--no-diff-added  z. L' T/ ?4 k# E2 b# `0 Z" X0 {
--no-diff-deleted" s4 k; K7 G7 P6 @0 N" O' }. X
$svnlook diff -r 40 /usr/local/svn/repos/; N& F/ s# @) x: B" _6 v: s
Copied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt); K4 Z" V0 ~  C" w" O

* \5 o# |. O9 H0 p- V# e8 |+ ^Added: trunk/vendors/deli/soda.txt
3 ]/ ]; D% I0 H' j3 a. S9 K3 h# d==============================================================================& ~' C: g' q, c" Z# P7 f- ~

  F. y* T9 w, w) ^5 \' E; }9 {Modified: trunk/vendors/deli/sandwich.txt, C( j$ \9 _! ]' v$ J
==============================================================================
4 v4 {5 P( f! Q0 `/ G--- trunk/vendors/deli/sandwich.txt (original)( @( M$ f5 }; Y
+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -0600
) ~  _$ b: \: ~6 G/ x@@ -0,0 +1 @@
4 f6 D/ ?! J4 P+Don't forget the mayo!
4 }4 L* H, q3 k0 }
+ I( w, Z6 a& K6 z1 }Modified: trunk/vendors/deli/logo.jpg& H! V# n& ~* G8 I# ~8 I# _
==============================================================================
' W: W' ^* n3 [( ?( q(Binary files differ)
) ^8 }1 V) x, K% G; L
6 I: d! S/ M4 rDeleted: trunk/vendors/deli/chips.txt2 F$ q1 G- b. Q9 l
==============================================================================
8 o+ M! `, T! S& N6 L$ k; }0 q  N& X- I1 l5 D  r3 N  ^
Deleted: trunk/vendors/deli/pickle.txt/ k9 u5 L1 y7 U% H" M' f5 t7 y$ V
==============================================================================/ {& D" I; X0 |8 J, H. O' ^
如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。
7 Q/ z2 a) X/ a1 s8 v5 y3 F! q( U' d$ _3 B$ ]
6)svnlook dirs-changed
' s/ \/ m1 B3 O+ a* e打印本身修改的目录
7 u% |, z3 Z0 i- Nsvnlook dirs-changed REPOS_PATH
; m" c% {$ x+ [- e9 a$ _, Y$ v- F可跟选项
6 @* G; e$ \8 w3 g# x3 c, p--revision (-r)
  X8 U  }/ I2 ?( i--transaction (-t)
5 ]$ a2 O, {% Y7 I4 [% t$svnlook dirs-changed -r 40 /usr/local/svn/repos" q- d: F) u/ r' a4 H9 Y+ N2 |
trunk/vendors/deli/
5 j* C( k& U3 R2 j
' y( }/ M+ S7 i, A7)svnlook history + F9 ?0 b* R$ t0 ?" j
打印版本库(如果没有路径,则是根目录)某一个路径的历史。0 u- o4 b; {$ |1 r- j, C( P
可跟选项% a2 \+ B5 W  m6 e
--revision (-r)  F" h0 `' |# X, W# s& W" i
--show-ids7 m; J6 O: k* D0 @9 O6 T
$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids+ q" t1 E+ \' d7 Q' y
REVISION    PATH <ID>8 K4 _" K' h; K; [, h1 W" G. G
--------    ---------4 f+ B/ N' n; I+ Q( B4 w8 f
       19    /tags/1.0 <1.2.12>
6 o" o+ s0 H3 r3 [       17    /branches/1.0-rc2 <1.1.10>) |1 V* u# T+ w/ v
       16    /branches/1.0-rc2 <1.1.x>; q, A' |. x3 N, d
       14    /trunk <1.0.q>+ k0 i: }# r& d. b, v0 }
       13    /trunk <1.0.o>
6 t% W3 q. c  _5 N       11    /trunk <1.0.k>- [9 m. F$ }9 ?* D. _; L
        9    /trunk <1.0.g>
! e- p  P$ u* e, @0 K        8    /trunk <1.0.e>  N& q1 T# ?7 v$ a- u  t+ p) m
        7    /trunk <1.0.b>/ n3 i- F: M- i
        6    /trunk <1.0.9>
+ G# t7 n. I: @4 a" H# `9 T( n        5    /trunk <1.0.7>" P9 Z% J, E" J; C
        4    /trunk <1.0.6>- J! `0 M0 H! X' H9 M. E) n
        2    /trunk <1.0.3>
" F3 e* |. S. W& F        1    /trunk <1.0.2>7 c5 a; k) f% j4 _+ \5 g
8)svnlook info # j% C5 Y: C2 h( M/ [: V
打印作者、时间戳、日志信息大小和日志信息。
" Q* B, {. s7 z8 F+ {) y% Z! G1 wsvnlook info REPOS_PATH: X# `& l4 _1 e, q+ k
可跟选项
" T3 p/ g4 C, j--revision (-r)
" B. @/ U9 N8 Y6 W4 {- v--transaction (-t)
; x$ F1 n7 }3 Q( E$ svnlook info -r 40 /usr/local/svn/repos3 d& j1 [8 m& X/ G
sally
/ `& r! Q/ E7 }  S2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
# }# W% q9 z% z$ f3 r$ p15! f8 Z, D6 p# `0 j3 U+ r9 w
Rearrange lunch.
# _' J' S/ z8 k
& a2 N8 Q2 L) H) i+ `; ?: C9)svnlook lock
0 Q9 d* b5 `. A  }9 g& j7 ^打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。
# y: B8 y8 j0 r: I- s9 Q: C& p这描述了文件tree.jpg的锁定。# e$ `" p! I0 X- s5 d( j2 |
' F4 e9 l) k$ @6 j$ z$ R
$ svnlook lock /svn/repos /trunk/tree.jpg
( Y) p( v+ t+ kUUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda813329753
; @& o* ^' Q9 {& Q% a) ~Owner: harry7 [0 b" w% L) S. s$ m& ]& e
Created: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)5 n) @) f& Z5 n! c6 \9 {; i
Expires: : v9 R/ d: T3 g* C; s
Comment (1 line):# J: ]1 N3 g' t# a% F1 ]* V
Rework the uppermost branches on the bald cypress in the foreground.6 F2 ~+ m6 _+ [! x6 ]8 h
# h% O; W, u& c+ m
10)svnlook log
  f" h- a" \* y7 O$ ^" f/ _2 k打印日志信息。! q! |: W4 ]( [4 O; e9 N! H) X
svnlook log REPOS_PATH
% ^, _* h8 [; l--revision (-r)
+ z9 j, R% _- B+ m! j+ k--transaction (-t)
# v! B. {# i4 `4 ]9 J1 D, w9 o5 j2 s; g: H5 _0 P0 H
例子: W4 @" Y) G& W6 r1 v- l9 d; r
$ Q  z" ]; h- i" i& f
这显示了实例版本库在修订版本40的日志输出:
0 T0 E7 u0 l* r& o( h, V: t) b) Y+ j2 f: W, f
可跟选项7 P, G& E$ @* f; d: c) ^; \3 u
--revision (-r)
" _$ U+ h8 f% d( L( B--transaction (-t)* @3 Z. w7 ?! `$ h
* e: B% U. _8 D9 s6 r. U( ]
$ svnlook log /tmp/repos/
& O7 \+ z& k, e7 e2 |, V5 o2 CRearrange lunch., Q1 y8 [9 a# l0 f. |
! n6 s! x& M) J4 s
11)svnlook tree
  p7 Q* y8 ^' D打印树。
+ p8 C( s8 r7 O! f5 t5 fsvnlook tree REPOS_PATH [PATH_IN_REPOS]
6 Q6 h; ^! P4 E/ b+ o1 ]: }打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。   ]; G# d& T! n

; {% f' H- c, f" e可跟选项1 i7 V. |- c8 {2 Z5 A" H. ~
--revision (-r)
/ ~7 `  j$ e  l* |--transaction (-t); b( y' \  \, [; j. L
--show-ids( z" w6 r8 T' x  C2 {) b; @) d! ~
# S0 A* t. n4 f0 ^# [% M' |
12)svnlook youngest
9 F* E2 R, q+ `* w3 q( F% ?# ?打印最年轻的修订版本号。
" _! W( [3 A! q/ F, U  d这显示了在实例版本库显示最年轻的修订版本:
, r% k1 O4 K  M5 N9 ?1 U, q8 ^) c6 k8 s" ]3 r5 v  G
         
6 F9 U, G, \( i9 T6 w$ svnlook youngest /tmp/repos/
5 \6 h' _. t2 w! f) V1 a- [# ]42
& C% p# d5 {' r: |8 Y
0 Q' q2 N6 h7 P: G2.svnadmin
/ L+ e$ Y0 ?* @9 l7 E1)svnadmin hotcopy — 制作一个版本库的热备份。! }+ y  r" Q# ?" O8 |
svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH
$ J' @$ y: Y6 y
) H) q: B9 e' E2)svnadmin dump — 将文件系统的内容转储到标准输出。
" ?" ?2 x4 R* w) I1 Y9 Csvnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。
+ j( @  d  Q1 O- Q* b2 D) h这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。
' ?7 K8 h2 [9 [) K( C/ N$ ^2 a6 d然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,# j0 N; y$ M, m
也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。
# S9 ?6 S  s1 I- e/ G  ^, m. [/ t6 k' D1 U
转储整个版本库:$ C2 d7 [  F" d! T6 [

7 K3 b) L8 u5 s# X1 O. Y$ svnadmin dump /usr/local/svn/repos
& x* h/ o7 R6 |" K# M! TSVN-fs-dump-format-version: 10 P. h$ K( Z$ N/ O
Revision-number: 0
- C3 Z  u( }* j, L0 Z, i* Dumped revision 0.- I* c6 N/ {1 f" W+ f
Prop-content-length: 567 n: ~3 y$ }2 [, J7 u# L9 L: J- |. O
Content-length: 56
) w1 Y* g8 ^) }+ W/ U  v; s1 W+ e

' ~$ S3 x1 ~4 @从版本库增量转储一个单独的事务:! x/ a4 H7 u* @+ Q* h
% ^' ^4 g; S0 J; `) \! {
$ svnadmin dump /usr/local/svn/repos -r 21 --incremental & q# [* N: N3 t' E% O! L: q1 i* G- v
* Dumped revision 21.& U& [8 Q3 p- M3 A! ?
SVN-fs-dump-format-version: 19 r& @' w& z8 d; M
Revision-number: 21" f( D6 Y. l( _8 }: ?. \
Prop-content-length: 101
/ w' f( [- C' W4 hContent-length: 101. g% x7 z& m8 v1 h, Z
( L0 @! l5 U4 a; N$ Y7 ^( c# }
: ~; n& z' [% s% a+ @+ I4 {

, K3 ^: s% M$ X( b3 A二.hooks简介0 B& h+ m2 b/ M

- u4 @* k8 Q: t; F/ H  [钩子脚本在每个repos的hooks目录下面。
# F: a7 a2 {6 w; K! w. |/ X每个里面都有模板,名字如下:9 E) F9 T/ |/ I; U8 D
post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl0 [0 z$ P# b$ g2 {1 ?' d/ b
post-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl: w% w" Y' D& \/ `( z
2 p1 n7 R6 |; I) i1 C7 d1 ]
下面对每个钩子的功用 做一个说明!
9 y0 K( h3 w  x) F0 I% h4 D- @  H, r% F. _
1)start-commit — 开始提交的通知9 j. y9 z6 Q- z* d
描述. Q- n+ v) [7 w" v* a

8 b: E3 L5 M  T( [8 Ystart-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。% E2 I: n8 ]8 f
7 ^; E  l3 z8 Y# J7 Z
如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。5 z. f8 G: r0 [; A/ l
输入参数% o8 L" l$ }, _3 K7 x/ a: x
4 q9 t# @& ?4 \/ H7 Q$ m9 P. l' g" F
传递给你钩子程序的命令行参数,按照顺序是:
7 |8 z9 t$ A! d6 [! z$ J8 J! k4 U* w1.版本库路径9 M- @: E( @* G5 K9 G5 i! {
2.认证过的尝试提交的用户名" Q# u/ U! l6 X3 ~& S9 a8 r' H0 Z
3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).& J. G4 M( e$ j. y9 C3 g& t9 B
6 T8 `$ E2 e2 Y) R& C
2)pre-commit — 在提交结束之前提醒。% s) Y) J! b; Q1 T
描述
" Y9 O7 |; b$ l) tpre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。" O2 l! N( H2 l
如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。
6 y: e. X- M& e! A5 ~$ M* \* f& d
. C2 r' A+ L4 j4 p) \# w/ k输入参数; f" x& ]- N, k9 X8 |( c# S2 f

: Q4 P' P+ h1 h& J; A  R传递给你钩子程序的命令行参数,按照顺序是:
" p3 D1 r, @" x& _1.版本库路径
, G  t6 z" \- j- Y2 h2.提交事务的名称
! y# c, K$ W4 h" o2 Q/ Y; D5 G$ Z8 Z& p1 O) _  p) o. Y
3)post-commit — 成功提交的通知。
8 d& a" R+ `  y: N) U+ P- c描述
; R' p, E2 M+ I# D5 X& Y, ]7 O4 q
8 j! d& X9 ^3 Z/ q( ppost-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。9 r! o8 t) l$ |0 s
如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。
9 N4 D) D4 Y* v. p, c, A2 p输入参数
9 Q, B, ?; m- n4 l- G传递给你钩子程序的命令行参数,按照顺序是:
# F6 x& b3 F0 i' c1.版本库路径
# r, `7 E/ b# S1 e, l: }- y* [9 v2.提交创建的修订版本号
5 G' [3 E8 k1 B7 O. y0 X7 z; m8 n3 ~; h6 m' {4 S% d7 {
4)pre-revprop-change — 修订版本属性修改的通知。% f* U5 ^+ d' \/ u
描述; g/ F" T5 A& g# g; y6 m; x
pre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。
/ l7 t) c! V1 ?7 e8 n6 K/ Y如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。
7 ~* V4 ?2 o) E- E8 M+ f$ O输入参数
5 T3 {2 s% P1 S$ M传递给你钩子程序的命令行参数,按照顺序是:
. j) q8 X2 F; E2 c! X: o; Q1.版本库路径
- _1 c4 g! ]( E: ~2.要修改属性的修订版本
* S% n( K3 [; V3.企图修改属性的认证用户名
4 X4 U$ ]" T4 n' m& y4.属性名称已修改5 k: v3 e1 Q% f6 {/ Q1 b# o
5.变更描述:A (添加的),D (删除的)或M (修改的)
( T! h' j9 o/ `  i5 O" w# l
. e1 P0 Y# L( R0 Y此外,Subversion 通过标准输入将属性的新值传递给钩子程序。# u2 P: w  K/ a3 F# a

! ]8 U% m  ?9 p; u5)post-revprop-change — 修订版本属性修改成功的通知  u$ q+ e9 ~% }8 G% B' k' W  M! t3 K( j
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。( Z% C: \, _  k0 q
如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。' ]* k0 f1 T, K3 `
输入参数
6 Y7 f' v: g- S6 n  q9 T. K0 \/ Y传递给你钩子程序的命令行参数,按照顺序是:) m1 f9 h" i* E  @1 j

$ u) w( r5 c7 q  n; J' U9 e1.版本库路径+ U$ B2 B# D% Y+ [( v
2.经修改属性的修订版本
: [2 a( r" r% s3.做出修改的认证用户名. p1 O2 ^; u8 |* v
4.属性名称已修改2 n6 e( P& }0 u' \. |
5.变更描述:A (添加的),D (删除的)或M (修改的). T# v9 r" p$ g8 p5 y! d/ Q
& y1 g1 V% b* n7 o
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。
6 r5 a1 ?' f, ?) h! }5 Q1 U
5 c+ @/ _& f7 v( w1 @6)post-revprop-change — 修订版本属性修改成功的通知
2 M. B! L) E: Q" \  \1 }描述* N! U) b8 J( d& g' ]0 C  D; \
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
/ e' s. X$ X$ A- B6 M8 ^! E0 j如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。; w' L% g1 [. N0 @! f
输入参数
' p0 Y3 Q+ @& l- g4 \8 l% K* ^) P. O
传递给你钩子程序的命令行参数,按照顺序是:/ _; K( Z( C+ w1 X7 r' N
   1.版本库路径/ \# g& `5 a, u3 A* y- ]4 s5 H5 t
   2.已经修改属性的修订版本  F9 j: A: w) l* @. u" W# t
   3.做出修改的认证用户名2 n4 s2 C' H  n$ L
   4.属性名称已修改
0 g, n" A9 I* v0 `: {   5.变更描述:A (添加的),D (删除的)或M (修改的)
1 m( O# X8 \  z8 K此外,Subversion 通过标准输入将属性的前一个值传递给钩子。2 L" L8 g' o9 Y% ]

( J: g. q  T. x2 W- ]' V7)post-lock — 成功锁定路径的通知。3 T# @- o! I9 H4 k2 S( y! N3 `! K" ?
描述" i6 z+ _1 G) r  w. e/ h, N
post-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。" y8 Y; e9 @* \
如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。0 |9 `# @* f6 b! x3 c
输入参数
# q6 O' w4 o: J3 N  n: K传递给你钩子程序的命令行参数,按照顺序是:- ~7 H0 \( B1 m. D
1.版本库路径
8 e9 p1 ~+ I) J/ Q8 e1 u5 R# K2.锁定路径的认证用户名
( f( N4 ~" b: a7 L
' s0 M3 `* \& i. p- I此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。5 T8 b9 ~0 n7 E

* a0 ]2 ~' q. j2 a8)pre-unlock — 路径解锁尝试的通知。
$ k2 f$ I6 E$ B- k描述: n* I8 m% @4 H$ u6 E$ a7 a
pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。
0 g) r: R; j$ \8 v# e% j如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。" A6 Y7 s7 l0 s0 E. Q# E
输入参数! ~. g6 Y0 e, C( o

: ]+ f. m* u& Q* J: W$ E/ w传递给你钩子程序的命令行参数,按照顺序是:! d3 q& ]) r2 o

, d" x$ E: h2 \# B$ t   1.版本库路径
; f, [7 u/ L: w   2.Versioned path which is to be unlocked
( [  T  Q/ P5 x, ~9 r, y5 q   3.Authenticated username of the person attempting the unlock
6 w! K% f) A) h% W" t4 G4 w3 f0 u* `# H# f* h
9)post-unlock — 路径成功解锁的通知。7 i' b! ^. n% r; E
描述
6 R: [1 e6 d" ^: V5 Q& e/ Opost-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。
7 h, d) F, ?$ B# M% [% H如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
" k6 f% `5 n- J) d4 v5 L8 ?2 u  ]输入参数
& J2 s+ p3 O& U9 G: Z/ z. g) e4 V传递给你钩子程序的命令行参数,按照顺序是:
0 b# B! U9 p  y1 q' j0 M1.版本库路径
( p9 |& Y) n: ?& o  n' H. ^2 m; l2.路径解锁的认证用户名
; P: F! U0 K, T: @3 O) O
& ?! R: K& X; H此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。
" u4 Z! g: l. v1 \
2 F0 l" K8 E4 z' M9 W$ f6 T( j, ~6 }( A6 q! M. D
三.hooks本应用demo! c: Z# G1 u0 T; _; P, p6 H/ ?
就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。
( l! C- }5 Z9 R! k" _! y
0 b* q  ~' k/ f: g9 b" c1.如果不想开发人员有删除权限,只有SCM用户有删除权限...
) j8 @; G  O- Q5 H  L. k: ]  G1 U# w4 K9 a
#############################################6 `" {; H* @- q( t% o5 |  j8 @
REPOS="$1"& v" J: j1 k8 v" j7 H; e0 y
TXN="$2"
. W( N6 U1 t6 m' f. v! xRES="OK"/ [- x+ K) ^" r  E. y* j* }
#USER="$3"4 `' D. b1 u3 w& _# T6 c' ]) h- c
Sorry~没有这个变量 呵呵
, E5 g# Y* H6 c/ G+ BUSER可以这么获取# c3 z# g- l8 I% m
USER=`svnlook author -t $TXN $REPOS`& O* p0 s( C/ b. `; Y
SCMLIST="user1,user2,user3" #scm人员列表; Q. G4 T7 R; d+ k& r

+ M! [5 Z+ R1 k: Zif [ `echo $SCMLIST|grep -w  $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断- v+ P0 N+ S' Y1 ~# x/ @& Q
then
) k: J- t3 G7 r& ]0 [SVNLOOK=/usr/bin/svnlook
) r* y9 z; C* A  N7 qLOG=`$SVNLOOK log -t "$TXN" "$REPOS"`) I! H  D  f7 F8 `4 ^  _) l
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
1 e4 F& Y2 e8 _. _4 o
  M* I; p, y4 S9 q- A7 N- Cif [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]
$ E7 I5 G6 v$ G" ?% y        then
! D9 ~6 ~6 o- _( S- |; U- Y5 O        echo -e "\n You Don't have the pemmision of delete  " 1>&2
8 l2 U# ]- E: h        exit 10 [/ G' D* d6 j% @6 m8 l
fi
3 D, L% ?  J7 e! n5 }/ afi
& H/ Q% m8 ~9 O7 t#############################################
+ J5 r- b2 C) ^) O' W6 G: h
6 P! i( T6 r; I7 y/ J/ v
! e7 T0 L( m/ v; `$ g
& {# r4 O1 j# S0 l) ^2.提交完毕邮件通知; C& E! a/ s- V2 v9 t- `
http://bbs.scmlife.com/thread-14543-1-1.html$ {$ {+ F" B+ u
见此帖子- @2 @( ], a! N8 d+ h
3.增量备份
+ y; R: v5 V7 i" I9 r
# a/ M6 B; _8 h- n: ]. Z
3 x1 U7 b  C& ~3 B" `% Y! `' y4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件
& _% x8 G, g( F3 w5 \pre-commit
6 X1 u$ G3 v9 ~5 U8 h5 @; ^###############################' A; i4 J: y8 m& X$ q
REPOS="$1"% p/ s1 V9 c% F$ s3 l
TXN="$2"& L3 @* X: k; j7 Q
RES="OK"
+ r& t4 O7 E! u3 K( H3 }) |st="k2/branch/BR-K2-1_0_001_20100316/"5 O# A/ [$ y3 H0 S
ABSUSER=$($SVNLOOK author $REPOS -t $TXN)
# I3 ]6 a8 B8 A- o" Y8 l. Sif [ $ABSUSER != "ads" ]% z8 Q4 `% B7 O' m- a+ B$ C
then
% t0 T7 B' N( A9 G9 U- x        if [ "`echo $files|grep $st`" =   "$files" ]2 d" O4 z5 [1 t
        then
, B1 E9 B# f0 Z" i# y9 r7 Y: o) J                echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2
& O% G7 l1 u( r( R. h1 i                exit 1
) t: ]  s/ m$ f. X4 V5 P( E        fi
% u6 g- e  H  M9 w8 }fi2 n: H- U( A! P; V5 U
( i9 z/ p. @! C0 o5 E% i) A
exit 08 m! E- r2 e4 {! W4 y" a
3 R% v* N8 B; K
###############################  q3 O  I8 m# f6 R' j2 @! h& i
自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。
0 }+ Q. O- T& d  W$ d( U- h2 Z
& H2 Q$ k7 i* F, ], n! @5.钩子脚本 对锁的管理6 l, b& u+ v1 G0 V) T' S2 m5 V
http://bbs.scmlife.com/viewthrea ... highlight=%2Bgo2cxg: t; D; s' K  _' c: ?
见这个帖子 有详细的说明。* r# I8 s* [0 e2 X5 Y$ u" U2 N0 X
- I: V3 W) h7 T1 Z/ ~8 [' n4 [
6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)
1 f6 E! q* x. [. p( G3 \& Mpre-commit
' b* H2 J5 l, j; K6 k9 u% |########################################( X) ?! X2 M  h3 p# P, L
REPOS="$1"4 q: E  \5 V5 L2 e
TXN="$2"
; r  K- d/ z' H$ _  HRES="OK"
3 m, ~, ^  u! pMAX_SIZE=10240000
0 u8 h2 E) U2 `' I: T) v6 lfiles=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')
2 M# \' I, t6 F7 U9 sfor f in $files
) Z$ u: I  O1 X5 f* ^- W8 U, Ido6 Q$ \, O6 o' A+ G% d# n5 u- O9 ?
filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)! B- _0 Y/ G% s7 a: P8 b9 i0 _% u
if [ $filesize -gt $MAX_SIZE ] ; then
; I4 `4 q5 l/ j: \  k* r, Gecho "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr
9 B0 {& a  i2 h& Wexit 1
+ D% j2 d8 z3 N5 x4 N- [fi) J% h& H% Z# H9 K
done
7 h- z' n8 n9 j* f: z4 U########################################
* S- J; g0 F$ J! y- }$ n- O! v) r当然 这里还可以做一些其他的限制
% s; V9 b' [3 u比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制
, D! O& i( {; C( y3 m0 ~4 c2 Z( w( h% L8 e2 M
[ 本帖最后由 go2cxg 于 2010-7-2 17:24 编辑 ]

本帖被以下淘专辑推荐:

  • · SVN|主题: 9, 订阅: 1
  • · SVN使用|主题: 1, 订阅: 1
发表于 2010-7-16 15:24:51 | 显示全部楼层
感谢楼主分享
) X6 r9 K4 r" M# @0 D学习一下
; _% M( I! x7 k1 g8 ?svn才刚入门呢。
回复 支持 1 反对 0

使用道具 举报

发表于 2010-6-30 17:16:01 | 显示全部楼层
楼主无私的分享,先学习学习;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-30 17:23:26 | 显示全部楼层
帖子比较长
, c3 L+ C! K2 N$ t3 }9 I) f整理的时间较长 大家耐心看!) K! \' X, ?+ ~" C' ~8 O6 A
有需求 尽管跟帖2 s0 \% J9 U+ \1 Y% e: C0 O
不需再另起贴~
回复 支持 反对

使用道具 举报

发表于 2010-7-1 11:15:04 | 显示全部楼层
钩子脚本真是相当的强大呢。。。。。帮我解决过n个问题
回复 支持 反对

使用道具 举报

发表于 2010-7-1 17:00:06 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

发表于 2010-7-2 01:26:57 | 显示全部楼层
果然很长很强大!& k3 A; C0 g' B( o- W

* B  D. i  m& p强烈推荐所有使用Subversion作为配置管理工具的朋友都要好好学习下此帖子,可将Hooks一网打尽,从而实现个性化定制需求,进阶SCM。。。& G% N5 D" e: o5 X0 n" }4 c! |) ^

, R! W1 |, n' |5 s感谢小光分享经验心得!!
回复 支持 反对

使用道具 举报

发表于 2010-7-13 17:09:02 | 显示全部楼层
很好,很强大,收藏了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-7-16 15:51:11 | 显示全部楼层
ok~~多提需求!嘿嘿~~~
回复 支持 反对

使用道具 举报

发表于 2010-7-19 15:47:54 | 显示全部楼层
  不错的帖子!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|无图版|SCMLife.com ( 京ICP备06056490号-1 )

GMT+8, 2018-1-16 20:40 , Processed in 0.087814 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

快速回复 返回顶部 返回列表