SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 46968|回复: 92

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

  [复制链接]
发表于 2010-6-30 16:43:00 | 显示全部楼层 |阅读模式
钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!8 Z% S8 _; v6 [: d3 U, @
下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。5 H, W4 C) F  R
欢迎大家跟帖~如果有新的hooks需求,请跟帖。大家一起来完成!  B/ t4 Q; }. e, b. v4 H& e, k- ~
有个前提,我觉得作为一个合格的SCM,还是有必要学点Shell或bat的写法。
. A- F% g; w& y. g& ]& E0 d; z) M所以对于看不明白钩子的同学,可以先学下Shell的基础知识。
2 P4 S) {# H# ]2 {: c4 L; f* D不然只是一个理论上的SCM。7 G+ U: |1 s# V4 S% f
谢谢大家!1 K9 s9 i9 o7 W- l
一.服务器后台管理命令- r  L6 b1 N- I
1.svnlook; Z2 i) y) p" A  n
1)svnlook author / ~. E8 g& E, s' \/ @
可跟选项8 n/ q6 _! E+ S/ a0 n
--revision (-r)
+ }$ M3 Q2 ~, u3 R/ p8 j2 {, P--transaction (-t)8 B6 q9 s) v: y- s+ @' Z8 b* |+ U
打印版本库一个修订版本或者事物的作者。
( i  @+ g/ N- ]& j0 Osvnlook author -r 40 /usr/local/svn/repos
( I3 U; r8 w3 t" m1 ]3 i6 d3 f6 w+ E" ?8 y7 }) t5 n

# v' C1 N% `  i' i" r0 i2)svnlook cat " k4 [% v% m' N1 i; X, F2 g
打印一个文件的内容
$ a' b) d" F0 b- X: Zsvnlook cat REPOS_PATH PATH_IN_REPOS4 P( O/ S2 V0 }0 [; s7 _, f3 i
可跟选项
/ I; \5 s2 a6 }--revision (-r)
9 r6 |' @& D9 b* a7 J$ e2 ^! o--transaction (-t), J1 I! O. S) c3 y0 @
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README& |" i7 G% {- q$ p
svnlook cat -r 40 /usr/local/svn/repos /trunk/README/ ^* F' I) V: u% `. ?( n
6 W% A* [/ F% {: j: H; L* h; x) D
3)svnlook changed
( b% F' [9 a# \! o/ e3 Z& ~打印修改的路径。
, W. I5 V) ]9 _7 b' R) ~% _svnlook changed REPOS_PATH --最后一次修改
: V7 E3 q( v8 tsvn update样式的”状态字符:
" K9 s! @' S5 _5 @: d  |'A '----条目添加到版本库。% g" W8 l4 ^* m
'D '----条目从版本库删除。
0 d# y2 d: }4 ~* @: y'U '----文件内容改变了。" c' n3 X) r8 p# Y2 H% Q
'_U'----条目属性改变了。: a) w* Z$ Y$ U' s$ m+ `+ @! w
'UU'----文件内容和属性修改了。
, X" K% k' R* \- N" _/ C$ ~$ B文件和目录可以区分,目录路径后面会显示字符'/'。 ! c. l6 Y# P& y3 |
可跟选项
" {" f" T/ c! }+ f6 w--revision (-r)
6 {) X+ A; A: |6 ^5 I) a--transaction (-t)
3 x+ s. {8 [0 @3 D9 \! j$ ~% lsvnlook changed -r 39 /usr/local/svn/repos
* H; `" ?! ~+ K; [
" p+ W6 h6 w1 Q, ^8 l5 d4)svnlook date- z# T0 x9 z2 G6 c4 n: w$ W% d( @
5 c6 u: p; C) D9 y0 K5 j
$ svnlook date -r 40 /tmp/repos/( o7 v7 I- v4 i. G. Q4 V8 b
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003); U- C4 x# V" ?& |
0 n* @: P" q+ M) U; d
5)svnlook diff: ~" m- o8 B' I  k( [2 J
svnlook diff REPOS_PATH5 }- V/ s( ]6 P+ Z
可跟选项, ]% m7 A$ y9 \9 c: n
--revision (-r)
) ]! R0 R$ L# G7 z/ }% n: e. O' R--transaction (-t)
) v  q# }) `: A" `1 n/ r--no-diff-added
# f0 \5 T1 h+ p$ r$ G: F$ ^--no-diff-deleted
" h0 ~* o' B( O" j& R, p$ q$svnlook diff -r 40 /usr/local/svn/repos/1 u. ^7 E) R6 w. C) y" S. B- C
Copied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)" F1 U8 ^: A* c4 _, a3 ?

9 S- c/ G# R5 d" kAdded: trunk/vendors/deli/soda.txt
* X, y8 U- U; [$ ]! b4 ]==============================================================================
- U+ e$ Z# E  Z' s' ^, ]( p6 w  l: ]
Modified: trunk/vendors/deli/sandwich.txt
- Q. ?" I5 x0 h6 b3 {) U==============================================================================
0 P/ D4 r$ ^& ]. l, `4 B" j--- trunk/vendors/deli/sandwich.txt (original)
, ]7 t! ]( D2 x2 w0 V# {+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -0600
; x& o( X8 M. ~& k( w@@ -0,0 +1 @@. I; @- g3 d. O( N4 A
+Don't forget the mayo!4 M- ~1 j3 Y6 h! ?- ^; X% \
% O9 j* B. H- }9 ~
Modified: trunk/vendors/deli/logo.jpg
' w0 D7 Q' ~! L2 U; H; R3 _==============================================================================
+ M9 p& [: F7 I' ~7 {. r(Binary files differ)
- z( m  z& W* r6 T7 x: _/ T% @+ Q. D1 S2 P
Deleted: trunk/vendors/deli/chips.txt$ v' x) T* N4 {+ V* w
==============================================================================/ S. n1 r$ |, _' f
8 R. m/ M$ P# q# s
Deleted: trunk/vendors/deli/pickle.txt
5 q1 H  \: u: p; A( e! v. h, ]==============================================================================
7 t2 b- B6 E, T& e7 I& Q- ~, z如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。 . K) h* |+ x" h# x
  X7 I( O. w3 N" X( r5 k+ r
6)svnlook dirs-changed
) f  [0 s! c5 e. `1 {- r1 I2 _1 m打印本身修改的目录
, u4 W) n. a% ?: K3 ^$ t3 E& ssvnlook dirs-changed REPOS_PATH) K; V9 W& M. [& ^0 U
可跟选项
+ R0 W/ Q$ Y5 ]7 D& e--revision (-r)
% o1 L2 N3 n; ?--transaction (-t)
. Z, u& y7 b- S/ r+ H% _4 `4 W8 J$svnlook dirs-changed -r 40 /usr/local/svn/repos7 y/ b* l- o; O' c
trunk/vendors/deli/4 q% a8 m1 M/ L* e! l' ]

4 j( s  X, k" P5 ]+ s. p# G7)svnlook history
1 D2 g6 k2 u% q( _8 F7 v. p, s4 H打印版本库(如果没有路径,则是根目录)某一个路径的历史。
5 L7 n( ]* ~5 J/ k9 V" y0 s可跟选项
, ?5 j# }4 ^* \--revision (-r)
9 R4 j; Q4 z6 S- O5 {--show-ids' Z+ U; W( r2 F7 _4 S1 Q
$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids7 s. k6 s. H$ {6 Q7 Z  d1 i
REVISION    PATH <ID>' o, q& L$ h; X& H9 y, x
--------    ---------
* f. b! B. {  y5 ~* {       19    /tags/1.0 <1.2.12>
$ p0 Q+ N: j5 z5 X1 F9 X3 m       17    /branches/1.0-rc2 <1.1.10>
0 U5 e1 R8 E6 y# ]9 T       16    /branches/1.0-rc2 <1.1.x>- X' B/ ]" Q' O
       14    /trunk <1.0.q>
4 `- a6 U. X9 w) W6 w       13    /trunk <1.0.o>
( x0 N3 P" B1 R& i       11    /trunk <1.0.k>+ n: S, p& b* g: Y7 H* k  M
        9    /trunk <1.0.g>" G8 |/ x9 s' S- B2 c; Q
        8    /trunk <1.0.e>
6 k" O$ N3 H& ^' ~* ^& O        7    /trunk <1.0.b>
( U; n& ?& ?$ t5 ?- `: t+ f8 Q        6    /trunk <1.0.9>
: d3 }# |% d# }( i* z$ R        5    /trunk <1.0.7>/ Y$ K1 J( v% B0 I& J& E+ \% Z3 F( x
        4    /trunk <1.0.6>
: [7 W" ^2 v, D! w0 E        2    /trunk <1.0.3>
- q! ^& H: `: U" g  l9 B        1    /trunk <1.0.2>
% u4 l  L' L! q( |8)svnlook info
8 g) A' U/ P. `/ ?: j打印作者、时间戳、日志信息大小和日志信息。 7 X/ h: ?0 W3 _# p
svnlook info REPOS_PATH
  A2 L. |. U" g4 W6 ~( G可跟选项
& p  F, B' s6 V6 b/ Y% ]--revision (-r)
4 y6 Y( A0 b+ W, [5 l--transaction (-t)& C0 O6 O6 x4 x' ^# a
$ svnlook info -r 40 /usr/local/svn/repos
+ N9 s) _/ S6 _% M5 tsally
* ^9 w, w; q1 \% Q  C; I& }2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)8 U! V8 Y( H  T% U
15
2 x* q; L  s$ z1 f/ h8 J0 ERearrange lunch.
5 u! T3 }2 v; i" U
+ q2 {/ p$ ^1 M( p# K! u& O! n9)svnlook lock7 P& G. D+ t" Z4 l; w- B3 D
打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。, j2 @3 F" ^3 f$ V# G2 m5 `- z
这描述了文件tree.jpg的锁定。
8 I( ~; o0 o5 ^2 P/ k* P9 t) M) q' Z" S. F+ u1 E! q3 h
$ svnlook lock /svn/repos /trunk/tree.jpg
2 }( C( d2 O" t* Z0 @UUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda813329753/ ~% X& _" r$ k/ A. l; H, b
Owner: harry3 T* P5 @+ L# R5 D/ O% M
Created: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)' d9 p+ R  V8 a
Expires:
! S( }* J2 n5 ^0 |8 f* rComment (1 line):
! c- N  g7 m% f: ?+ pRework the uppermost branches on the bald cypress in the foreground.6 K7 j: e  _5 L

# J$ B3 f& p1 i; n8 L$ M6 a  M* c' B10)svnlook log 9 Z) c0 W# H* T) Q- x$ o0 {/ r
打印日志信息。- c% n9 H/ C% ^$ ^  s
svnlook log REPOS_PATH0 F; w# q" S5 P3 i& w: _  w8 v
--revision (-r)( A, G' s3 I7 s( d+ ]2 X8 d4 r
--transaction (-t)) x, _3 D/ k8 h0 ~

2 @" u9 H7 O! l! H, \, P: J7 V5 r, C例子
# h+ j( S# K0 w' n3 a
7 p- p: Q( o3 ~% T这显示了实例版本库在修订版本40的日志输出:' u. Y' K% w( B
0 l9 `2 L- A. K9 S7 h  U
可跟选项
2 ^* [8 `0 ?0 @" n--revision (-r)
( L; ~! p6 v" r8 F/ ]--transaction (-t)3 l/ R: [: r0 g  W$ e- y/ F# N5 O

$ o9 C. ^$ v# Y8 c" g% P$ svnlook log /tmp/repos/9 `4 P; l& _9 l; S9 G
Rearrange lunch.
6 e8 |. x) u, V+ }4 {) q! Q6 C+ z0 K, D- c
11)svnlook tree8 P: e2 Y8 s) P1 b
打印树。" [- _7 b# n1 z; [1 \% B
svnlook tree REPOS_PATH [PATH_IN_REPOS]1 [6 q! p: ]7 d/ ?; q
打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。 8 X# @6 T! P- @0 R* T& H

( `3 B6 j4 y- l, w0 c' t+ c可跟选项' t' k) q! j( O4 k
--revision (-r)6 I/ Y$ T) j$ m. H5 N& R( T& Y
--transaction (-t)  _6 i. e' i  i
--show-ids
+ R5 v2 U' m$ n) W, U% Q
- I; `, J  n& N: R/ U6 u12)svnlook youngest
* C) }/ e# C' q) f, h打印最年轻的修订版本号。( Q$ h. j8 z5 V, `# s6 _  ^
这显示了在实例版本库显示最年轻的修订版本:- A2 G4 ]) \% I7 K

" Q  E/ o; B- p" W* C9 o+ X         
: i4 f) s$ j$ ]% d$ svnlook youngest /tmp/repos/ : J9 \/ S; K+ R8 [, p
42
7 b$ c% E  `$ n0 f4 d
2 i' D7 g3 H* [/ y( J2.svnadmin
! U* Q. c$ K/ [# ]) M% M! @1)svnadmin hotcopy — 制作一个版本库的热备份。+ f% _- q0 L3 D$ N& h: B1 b! e
svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH6 q# F, C6 x! a) h7 @

- O, \3 u, x4 g6 S4 U2)svnadmin dump — 将文件系统的内容转储到标准输出。
8 L1 l: o9 Y% I; lsvnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。# u. r+ j3 W1 ~% y
这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。5 K8 c: ?' L; J' T
然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,4 r" O5 ]8 ]6 O1 X% p: K
也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。2 {" \8 v' o2 Y" I; r8 O
3 V) M7 e3 `  u) r  V: T2 p( ?
转储整个版本库:( Z) |3 X. b2 b, y

* u/ p4 r3 ^: m2 L$ svnadmin dump /usr/local/svn/repos# c. z  C* x2 R8 c
SVN-fs-dump-format-version: 1
0 h2 q# s4 E+ gRevision-number: 0
' p! N" d9 m1 v( N2 K* Dumped revision 0.
0 H1 K. m2 J2 h  Z: eProp-content-length: 56( i8 E8 }  z1 Q3 f2 h
Content-length: 566 _+ G9 l8 n& |6 D
1 L4 b; d; K% _/ c5 K. l. s

& }# S; D) a+ {从版本库增量转储一个单独的事务:
$ J( C3 c1 _; b9 V2 U; u5 k8 v6 O. I' [! }) S
$ svnadmin dump /usr/local/svn/repos -r 21 --incremental
9 P4 A9 i. l6 y( k7 G* Dumped revision 21.9 G; ]. W8 v7 y" ~- z! Z8 F
SVN-fs-dump-format-version: 1
1 ]: a& K8 h$ P+ Y$ |3 }( K/ |Revision-number: 21: \5 D; Q% U- H" X* S) }, R1 A9 Y
Prop-content-length: 1016 S3 M9 U" ]0 X7 ~1 g
Content-length: 101. A4 F, ]. f3 S; l7 g
8 g9 t. z4 R: j1 l* J7 y$ |; w
! Y8 ^9 |( y1 i; `
* M! A# f$ C7 m2 A
二.hooks简介4 i9 V, H* c# H( F
- o' A, d- T, `! ]* Y. w
钩子脚本在每个repos的hooks目录下面。8 B# V* }3 P3 E0 s# H
每个里面都有模板,名字如下:5 a% k# r- T. t/ O0 f  p; \
post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl+ n- z% S* a% r
post-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl' i/ V8 T0 G3 ]0 Q4 g3 j

6 x/ l# X) E) A下面对每个钩子的功用 做一个说明!
, C  S% H* u* {% t  n/ Z; m/ V, E5 @) [# h, z& k7 \  a
1)start-commit — 开始提交的通知, `( F+ |& q+ E3 Y, p4 D7 G
描述3 }( k# T' O( t* d2 I
2 r& t3 `, ?+ c- x6 ~% ~
start-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。
9 r, A& L% M; C0 w9 I4 E+ U  `/ h5 p
0 [' n. F! Y9 z8 N" o9 J如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。
7 y' y- H& U- x5 e/ z; E/ X; X' N输入参数  j4 g$ K& z3 l6 d
8 T- L; W0 P9 R. n" E4 J. W6 s
传递给你钩子程序的命令行参数,按照顺序是:3 x2 Q: ~' B, t5 q) J
1.版本库路径
8 j& M" X6 C" y3 e/ A2.认证过的尝试提交的用户名5 Q( r2 p% Z5 s3 v/ ?
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, }5 D+ L; e' ]

/ Q" h0 i9 b: B: y2 q8 Q2)pre-commit — 在提交结束之前提醒。7 ]1 U  U, {. [+ s! O
描述
/ f" }- o6 S6 R! r- ypre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。
" y+ y, t7 {7 b' z( M# R1 B' a如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。) o) V5 y; v+ `3 E  c2 r
: b& G" Q5 c9 k: K- L/ ^2 m5 S
输入参数% V2 V. c! C+ I' w, o: h# H
* u5 U: b/ f! H# r; l2 E+ A
传递给你钩子程序的命令行参数,按照顺序是:/ D( W- ]5 N6 K! Q8 I- l1 i0 G
1.版本库路径
0 U/ l  G. r9 E7 Q6 S5 a; ^2.提交事务的名称' [5 s' }7 [$ U) i( l( f
9 D! E1 n" l% \- _
3)post-commit — 成功提交的通知。
, G- n; n2 W  W* u描述
4 g  S' |2 Q2 d- S6 Q2 A8 e6 J& s% S
post-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。3 @1 c0 i& R' @- \8 `' R* o
如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。* h8 N# }' M' K$ O
输入参数# {# g, W: u. J9 k( R/ [$ F. O
传递给你钩子程序的命令行参数,按照顺序是:9 S" r7 G' m+ f4 P
1.版本库路径
" |2 k: R2 e! |2.提交创建的修订版本号
1 c# h/ D# C; {# \$ p7 j: F/ \
8 f3 k  I0 ^7 U) F+ A- t4)pre-revprop-change — 修订版本属性修改的通知。( n; E8 S' b3 V  O& ~
描述: {* {4 X* E( p: F. t* z) _4 B! k$ K
pre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。0 D4 F  T  D  {* o- B- s' N
如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。
: x; }$ ^5 V- i" ~; w3 U输入参数5 r* }6 x& H/ S4 ^% M  R5 y
传递给你钩子程序的命令行参数,按照顺序是:4 U/ N6 b# I  k! R
1.版本库路径
7 h* n4 R1 r# [1 Z7 t/ N1 O  f" q2.要修改属性的修订版本
; c7 p7 ]" K9 M6 @3.企图修改属性的认证用户名5 f3 o# I6 [* v. |( K2 O) g: v
4.属性名称已修改5 C3 i6 A  f0 W1 ~) `
5.变更描述:A (添加的),D (删除的)或M (修改的)
# J) _0 |5 U' c
$ I- R2 `8 m( T此外,Subversion 通过标准输入将属性的新值传递给钩子程序。
1 q$ [- Z5 m! C  A" u' d. H4 ]% A' K  Q% ^0 N' j$ |6 D
5)post-revprop-change — 修订版本属性修改成功的通知
5 ~/ n; H2 o4 Xpost-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
7 Q: W9 b9 z, Q9 v* s$ C/ a0 X如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。; [3 ?4 J! ?5 F5 Y- h; {' Z
输入参数
3 e/ ?$ C2 D+ h& W) T! T3 p传递给你钩子程序的命令行参数,按照顺序是:
5 n" _/ b+ S9 T7 V/ U, W7 m, L  g# e: _# s
1.版本库路径
* S( D6 \1 i' y/ r+ ~  K2.经修改属性的修订版本; K0 w3 Q9 b" H6 @  `' B; v
3.做出修改的认证用户名$ j. k; R! t8 J0 R3 [& S
4.属性名称已修改
! e- q# C! @& j& s, u5.变更描述:A (添加的),D (删除的)或M (修改的): Q4 t; ?# V" _2 s, o7 I

: y* z% g8 n, K" m" O/ j此外,Subversion 通过标准输入将属性的前一个值传递给钩子。1 H3 @6 q7 o  U2 C* N- T" s6 p
9 a  T/ R  F1 _$ g
6)post-revprop-change — 修订版本属性修改成功的通知: e# ^- o; p* A' |& W' X, s
描述; D+ p, W8 |/ \9 k+ F
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
0 s7 \8 f" w0 _如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
9 l  P, K1 H" d! @/ V0 [1 z输入参数
: @; U+ s. X, R7 l7 H( k' ~0 \( {3 b5 h6 L8 B$ ~# I% D2 j  M, b
传递给你钩子程序的命令行参数,按照顺序是:
; K6 V" M+ n  F+ b   1.版本库路径
4 u: L" i. J' _   2.已经修改属性的修订版本6 K' X4 Z( V# g' ]8 @- k
   3.做出修改的认证用户名. k" }* m% R; h5 ]$ _0 |
   4.属性名称已修改3 I  P) U, t" I
   5.变更描述:A (添加的),D (删除的)或M (修改的)3 s7 \/ w. K1 I8 c: V
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。
1 ?5 z: B: M4 }9 @! R: U1 e! H5 f
# S: X3 m# D' n" g" ]; ^7)post-lock — 成功锁定路径的通知。7 C( l) v$ C$ g: u( f( s9 Y
描述
7 R9 l' L& ?! G9 B# B( Dpost-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。2 r) a$ y& y" ~! D; z
如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
6 e+ g% j* x2 h4 ]- J输入参数
' M" j; C/ e: W& @传递给你钩子程序的命令行参数,按照顺序是:
2 R* d& D7 A1 U' w2 E1.版本库路径5 `# c: f/ p: I+ m" P0 x
2.锁定路径的认证用户名
4 v& j/ E) A1 `  m' J
; }: g! _* S3 \4 h& c此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。
1 q- A5 x* ]/ p+ @7 {: `
- W1 Q+ Z/ C, ^8)pre-unlock — 路径解锁尝试的通知。
) L2 d$ P, G( K3 q% ~2 J& X描述0 J2 j8 S/ m5 v! e+ g: c7 O
pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。2 T3 d% A) T+ C( m9 m
如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。9 [, X# v$ a3 f  s. I  E' Q
输入参数
5 |5 o" o9 N  Q4 `* x0 B* T
; a) l9 A2 o; e传递给你钩子程序的命令行参数,按照顺序是:
$ S+ }6 |6 P  x$ d& r
: F0 \% u* B7 P+ F. f" I   1.版本库路径
5 h8 q$ X/ y: h   2.Versioned path which is to be unlocked6 ]3 o$ U6 X& m3 ^* P
   3.Authenticated username of the person attempting the unlock0 K9 ~9 F! _% p! p- M& O5 J9 Q" O

$ Q( F; c0 _4 i: e/ f9 R9)post-unlock — 路径成功解锁的通知。+ Q7 Q5 m5 N) W. o3 d/ E" g+ _' _3 W
描述
8 H0 x* Q, Z% |9 |- jpost-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。, d) m6 q. M! x6 @  L
如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
. v3 Z, G( n- a( J" K' `2 u7 U输入参数! ~! M/ v4 V! e4 ~6 N
传递给你钩子程序的命令行参数,按照顺序是:3 V# U' D1 A5 {3 i$ G5 p- K
1.版本库路径
# f/ u8 I( r, w2.路径解锁的认证用户名
4 d3 ], [& {" P) A0 |: {4 Y  c" C- @& E
此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。
) o% j8 C0 Y; X- t/ j; B: d) L
7 q* }$ h" e  p3 V% W' }# w3 ^+ _! X- ?3 j& R' N
三.hooks本应用demo* a1 y2 x- O& E/ E' ]3 {6 l
就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。
9 f; O# e8 \' g' R/ r$ R' q- }7 Q& f: b3 b" p
1.如果不想开发人员有删除权限,只有SCM用户有删除权限...; c4 r: E) D3 F- g
/ _" z! F% a) r9 J1 p+ ]
#############################################
- B- J. @  X, p: L# nREPOS="$1"
7 a7 p$ v& Q' N5 C$ M5 V& q0 OTXN="$2"  b0 r7 o5 p! u
RES="OK"+ y& F# u# X# t- K' `6 j
#USER="$3"
( d4 `4 V) i+ n* R7 W6 HSorry~没有这个变量 呵呵
" n' M1 M" ?- l8 [/ ]9 ?USER可以这么获取( W5 a  ?) T8 ?% `% z
USER=`svnlook author -t $TXN $REPOS`
# \( E- l/ l5 MSCMLIST="user1,user2,user3" #scm人员列表2 p5 b% E) C2 x2 u) F! K( r
1 ~+ e  M. ~3 ]( u, i% {
if [ `echo $SCMLIST|grep -w  $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断
' }: L  A8 w! e+ F5 @then
$ g/ {; N" [9 j& p! M) K4 m, }SVNLOOK=/usr/bin/svnlook
; V6 ^* o+ B; k' {LOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
0 z0 \! U) f2 cLOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
, M# g/ s# V. ?+ X; Q" Z/ Z" I2 x# C' N0 a7 W' w+ i; \
if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]3 q# A/ Y* N/ C0 m! [$ y  D& g
        then' D9 j6 f. K- B) a9 G, K
        echo -e "\n You Don't have the pemmision of delete  " 1>&2& G: b5 ]7 O* s( |+ c
        exit 1( y$ {( m; Q" j/ h! d# E- |" Z
fi* {* s" P' L$ s
fi
. N/ A  c' f+ y8 k1 {+ R8 W#############################################% O2 Z3 K3 t, C4 J
! s( T* {/ i, q: F4 O" R9 S
8 B9 @0 o& X, w3 {/ L/ j

' C; g+ t1 M# Y4 i4 J/ q1 d2.提交完毕邮件通知
( \* J3 W# h* k  l4 jhttp://bbs.scmlife.com/thread-14543-1-1.html& S, d9 S# C) A2 T4 E  n* h. h% b
见此帖子; O0 C9 B9 c$ f. h( r; E# K1 s
3.增量备份: d& A9 ^3 o4 u* X. Y/ y7 b

  w. _4 p9 x: g& M1 k& R
0 ~# z3 \3 `% h3 r" j8 Y4 f4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件- q& \, x% c$ |8 _+ U9 {6 Q! a
pre-commit" }" a) A+ T  U& ~% c' {
###############################
9 I; o+ x/ A. c; S/ i' KREPOS="$1"/ ~+ {0 I  K5 w/ i7 V
TXN="$2"
* |. ?$ l4 w. {8 U2 @RES="OK"1 D* L& f* }2 d0 r+ o' T4 Z7 p/ H; m
st="k2/branch/BR-K2-1_0_001_20100316/"
! d8 _) ]1 a9 K+ AABSUSER=$($SVNLOOK author $REPOS -t $TXN)/ H( x* l8 M$ h& ~; _  T
if [ $ABSUSER != "ads" ]2 k7 ~, Z8 c1 g4 i  _3 g/ v
then# h+ r/ F+ @2 W0 h9 ]: D
        if [ "`echo $files|grep $st`" =   "$files" ]" @  a, i* p. @% u6 ]) b, k
        then# Q8 ]+ G* J+ p- \: y
                echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2
! P! c4 U9 B9 O+ F" S6 m9 {                exit 1% P# W+ ~4 W& |9 j% U5 s+ I- L
        fi
4 E/ R* ?* A$ F* ~% A" Q! Q# Y8 Ffi# x& k: U4 d2 E: v

$ o" g% [9 U( S! `9 \9 f3 v7 Dexit 02 t9 m( {1 s" r% E% a

& L' M/ x' f; C/ |8 `# W###############################2 l) P8 V( F+ q- x, k9 ~1 ?
自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。
4 X) X" u+ ]' M8 P
5 o2 C% I% B, t- f" o5.钩子脚本 对锁的管理
! R& m  Z! ?% p  Q' Xhttp://bbs.scmlife.com/viewthrea ... highlight=%2Bgo2cxg5 X8 _9 v4 W1 y8 K0 l# @4 N
见这个帖子 有详细的说明。
$ T7 }+ b" w# n/ `6 _  A: Q( ?
1 D# v! s( n6 r3 b6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制), x% T6 z# _- n2 }
pre-commit/ \8 V) r5 J4 t8 g5 v
########################################
* B2 E9 |; }. rREPOS="$1"  b" ]3 n! E! e6 c6 ?0 m' l; h3 W
TXN="$2"& B, \. Y: T+ R( d; X
RES="OK"
9 z2 e3 s8 O5 U% [0 LMAX_SIZE=10240000
1 C3 w& v- q' b' d7 k1 z# sfiles=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')
0 N0 U9 U( f" ~6 [5 n: K) pfor f in $files7 t0 q( ^1 }* a  @+ |* Z
do9 S0 c3 ]) g$ [! {  d; s4 w
filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)8 F' s6 i4 p( L' i) G
if [ $filesize -gt $MAX_SIZE ] ; then: d2 d1 I# F' V$ l
echo "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr
( J9 J" n1 ^% ]1 R* H* ]+ Bexit 17 Y" \3 }6 o9 y, Q) i
fi
8 Q/ V4 @0 `- I& L! Sdone
5 r+ g; {. O' ~########################################
$ `. Q$ ^; p" Z* o当然 这里还可以做一些其他的限制& y* }1 B0 P" t( t
比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制
4 u) C1 z, s0 z5 k( ^) e! k4 E, I7 A8 a# n! e
[ 本帖最后由 go2cxg 于 2010-7-2 17:24 编辑 ]

本帖被以下淘专辑推荐:

  • · SVN|主题: 9, 订阅: 1
  • · SVN使用|主题: 1, 订阅: 1
发表于 2010-7-16 15:24:51 | 显示全部楼层
感谢楼主分享8 X7 `) c4 g* @* l3 u" r* V' S
学习一下& V$ D, q; u/ f6 i. ?) r3 _5 d" L
svn才刚入门呢。
回复 支持 1 反对 0

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2010-6-30 17:23:26 | 显示全部楼层
帖子比较长- G+ B5 C5 c0 M: [
整理的时间较长 大家耐心看!. Q3 E8 _5 v' a6 q& K5 o. O8 ^  p
有需求 尽管跟帖
7 p0 H1 i" V2 }3 N4 I- B$ Z4 ~不需再另起贴~
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-7-2 01:26:57 | 显示全部楼层
果然很长很强大!
4 U  g5 X( F4 R+ x
3 o  g9 q, _$ l0 v6 K强烈推荐所有使用Subversion作为配置管理工具的朋友都要好好学习下此帖子,可将Hooks一网打尽,从而实现个性化定制需求,进阶SCM。。。; K: V2 D. }* ~: k0 p. Y7 S9 N" K* Y) b

5 I+ O5 f6 h+ Y8 d( G2 {- E1 ~感谢小光分享经验心得!!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

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

GMT+8, 2019-3-23 13:24 , Processed in 0.094542 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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