SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 48133|回复: 92

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

  [复制链接]
发表于 2010-6-30 16:43:00 | 显示全部楼层 |阅读模式
钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!
3 ~& Q" c* ?( ?& A5 I7 q下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。; ~5 l! T/ j: [: e) a$ S/ }" w' q
欢迎大家跟帖~如果有新的hooks需求,请跟帖。大家一起来完成!3 `' Q5 v7 C4 S
有个前提,我觉得作为一个合格的SCM,还是有必要学点Shell或bat的写法。0 q) e8 W3 A: V, e! v
所以对于看不明白钩子的同学,可以先学下Shell的基础知识。0 p3 D# r. o$ j( r1 Q6 W5 Q6 W6 O: t
不然只是一个理论上的SCM。1 d. r: U4 _" X% T: m" ]4 R
谢谢大家!0 u, R/ ?- O( D  G' P  c" j6 Q# F
一.服务器后台管理命令
' h5 b1 L4 s, a4 Z/ _' I; K, _1.svnlook
, _( U3 g9 ^1 Y, X3 q; r  k1)svnlook author
, \: s) T+ \  c可跟选项
9 \- k5 d! g/ t--revision (-r): z  `* h& @# ^  O8 V
--transaction (-t)* Z  i  L: s/ q* h$ I9 A1 R
打印版本库一个修订版本或者事物的作者。
; u1 Y& U3 {8 s0 v8 s* X2 g4 ]svnlook author -r 40 /usr/local/svn/repos& S* Q$ ~1 [# E5 d% B

7 F2 q/ G/ M# {& \( ?4 e& T7 ?
1 G7 V$ T1 y. F: C- ~7 e1 s2)svnlook cat ! G9 G- A8 P5 M- S, B
打印一个文件的内容
* X1 e# a2 }: ?( r$ g4 Osvnlook cat REPOS_PATH PATH_IN_REPOS
/ v; ^$ F# F4 ~- P" c) k  b可跟选项! Z5 e, y7 T( n* b# c# \4 `
--revision (-r). ~- K! h' M5 H1 W) S4 i
--transaction (-t)  T1 ~0 ?5 \9 A4 J% z
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README8 |) o8 Q& U3 l1 C. D6 v: C2 K* A, \
svnlook cat -r 40 /usr/local/svn/repos /trunk/README
/ @" \$ J4 Q) r! i
' C/ W; V; U1 _" W3)svnlook changed8 i! F. t9 |1 C! }
打印修改的路径。
4 x' a* k" P0 t, o& S% ~svnlook changed REPOS_PATH --最后一次修改# x! ?# c( |3 E- N+ \
svn update样式的”状态字符:
" R  B3 ^- D/ a6 ['A '----条目添加到版本库。1 X. ?& |% d0 ~2 i3 C+ N& V$ o
'D '----条目从版本库删除。
: X: o  ~: M( @$ G: s' d6 X" N'U '----文件内容改变了。" O/ ~! G. j/ D( v
'_U'----条目属性改变了。
( q4 o7 a2 C6 @: u1 C'UU'----文件内容和属性修改了。& r5 E# a8 W7 W/ o
文件和目录可以区分,目录路径后面会显示字符'/'。
' _* d  F2 w# [; }可跟选项
$ f7 s" l& P; w( }! d--revision (-r)
% N9 k$ H+ k% j--transaction (-t)8 p) i' C; l; h% R# R
svnlook changed -r 39 /usr/local/svn/repos
' r9 |" d+ K2 f. m: F! `" R$ W3 p# w6 @/ j
4)svnlook date& {  n0 v& y$ [+ U

7 Y& U2 I3 j7 K; F. G$ svnlook date -r 40 /tmp/repos/' I0 D9 V7 W7 }4 p. M! z: W* T
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
& d, s0 d( x7 @- u# e' L" ~5 l6 p% a% O' i  g, _3 F
5)svnlook diff( b' G9 g8 a- N$ l
svnlook diff REPOS_PATH
/ h' `. v! W- M5 J可跟选项# w% J% Z% o! S( N& a' O
--revision (-r)
2 v- s+ T& j! U0 |+ E/ I) w  p--transaction (-t)
2 a9 N& Q+ K* i8 @5 i. |9 _4 b9 u--no-diff-added
9 F  [" Y9 \5 \, r# T' y( C--no-diff-deleted
) d2 \2 Z4 C5 a9 l$svnlook diff -r 40 /usr/local/svn/repos/
6 n8 n" ~8 g& TCopied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)
4 W" Q3 c1 I3 {, D- I) r2 ^. M( o% I( d7 [) @$ R
Added: trunk/vendors/deli/soda.txt& z0 d- M; o* g6 q1 D+ h: e
==============================================================================
3 R4 e1 Z4 D+ p* Y! M  z' I6 T7 o/ ]  |- L" C% g6 |* G# K4 f
Modified: trunk/vendors/deli/sandwich.txt+ e9 `) Z4 k; \! p
==============================================================================8 S1 E1 @. S* w0 R  J; f
--- trunk/vendors/deli/sandwich.txt (original)/ z; W* B4 ]( S* T
+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -0600; y+ [2 y/ c7 ?4 t2 S
@@ -0,0 +1 @@: q) @( K1 S" Z0 ?4 T
+Don't forget the mayo!7 l+ |6 K+ t' e) r3 G
7 o3 B( [1 v; m/ h0 b
Modified: trunk/vendors/deli/logo.jpg
& w. P0 o4 `  g& l3 x==============================================================================' ]4 y+ c$ D9 p
(Binary files differ), x2 C. Y$ |6 }8 v- {

9 V! b- L, c1 V0 jDeleted: trunk/vendors/deli/chips.txt* ~6 x- o: Q- @( a4 f) t
==============================================================================$ p0 n* c; `: y4 l/ r

5 c; I# o: _% e& B" b, [, K) ODeleted: trunk/vendors/deli/pickle.txt
' Y9 @% ~5 B4 o; B4 ?7 A. T==============================================================================
& l/ V7 j1 E* K* C+ T0 N( {+ x如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。
$ c: ~5 q+ N3 {' X6 g5 M$ \5 v  |; n5 S3 v( L: _1 |
6)svnlook dirs-changed
4 W; S$ `) n' O0 `打印本身修改的目录' k! ]9 Z: h" P& u7 ~% a
svnlook dirs-changed REPOS_PATH
+ r" g) r& j7 x$ Q# s7 v可跟选项' M- O4 e# F' D
--revision (-r)
7 [" j! a8 Y. \1 X' ~/ s--transaction (-t); H, B4 O: g+ Y$ o! j
$svnlook dirs-changed -r 40 /usr/local/svn/repos& W$ Z8 R+ I5 C: \$ W$ w5 |7 o
trunk/vendors/deli/2 k2 t( j7 n& R0 K+ Z: a

; \) a+ c" u2 \" }7)svnlook history
7 o9 R+ [  d- ?5 r7 @打印版本库(如果没有路径,则是根目录)某一个路径的历史。' y8 r' `/ X0 A1 c' A3 {+ z, @
可跟选项- l# ^- z; h( J6 H! Q9 O- t2 E& W
--revision (-r)
* s% w, Q9 a' a! v  D( J  F--show-ids
1 e& a4 b. B" x$ `1 M3 m) s" a- o$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids
: u. o3 T- ]/ P0 U# z  W  iREVISION    PATH <ID>
* N* w' n  ]5 w) B--------    ---------
) {+ x8 g* d; m* }       19    /tags/1.0 <1.2.12>
8 n+ S+ j/ r5 Y  ]6 d4 l  c$ q% }1 T       17    /branches/1.0-rc2 <1.1.10>
4 R' `" s" A# h2 V       16    /branches/1.0-rc2 <1.1.x>- k  a+ i" i/ ~. x/ U$ w/ x
       14    /trunk <1.0.q>
- u5 x: a* }% f4 l/ j% r1 G       13    /trunk <1.0.o>
, W5 V  G) E& W; t) |, l$ a       11    /trunk <1.0.k>( V3 z6 z% p. q0 P/ F1 y
        9    /trunk <1.0.g>
# V2 L9 `  T' K8 ]        8    /trunk <1.0.e>
( a' T8 r. l" ]6 j. H( v        7    /trunk <1.0.b>1 k; N3 P+ h& C2 ]3 f+ l
        6    /trunk <1.0.9>% J6 e# g+ c6 A1 D
        5    /trunk <1.0.7>
! l1 k- \% \# G* {$ u        4    /trunk <1.0.6>
$ a7 ]/ E' ?$ L' a; Q# t7 o        2    /trunk <1.0.3>
7 l, {+ G% a. W0 F        1    /trunk <1.0.2>
# n, B! h  C! O/ x! j% ~8)svnlook info
2 {4 u; H5 a; D8 z/ T2 k4 x! W打印作者、时间戳、日志信息大小和日志信息。
. t# X+ m1 m# fsvnlook info REPOS_PATH9 G$ M. E8 \5 \6 p
可跟选项
* J6 ?% G9 j, Z1 F# ^--revision (-r)
% G5 l8 `6 X# r4 I& z& a--transaction (-t)
# J6 G4 r2 E6 |0 S6 R4 D( p$ svnlook info -r 40 /usr/local/svn/repos4 k4 W+ R; [2 d3 h
sally
4 M1 Z- u" _" `% k! T: a& Y( s2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)# z0 w- c  J  X2 Q+ S: `, z
15' C) p( T, l9 W6 B1 [
Rearrange lunch.% P8 ?3 z. m; @

/ d5 `% d5 Q' Z, q  C+ A" e9)svnlook lock$ m$ v9 H1 \4 Q2 d7 P5 h
打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。
: c3 b# _0 j) T- ?) A; f这描述了文件tree.jpg的锁定。0 W9 Y, T3 K- U% h
; w  _$ ~  ?# I, a+ e6 e
$ svnlook lock /svn/repos /trunk/tree.jpg/ ^. B  L! r1 g! [4 w/ d/ K9 z3 P
UUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda8133297535 u; k1 a! j7 j0 Z* n2 \
Owner: harry0 f  C& a$ t# \: f5 G( V0 X
Created: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005): D  z1 q: x  B6 M& c4 o
Expires: ) V: s5 F' C4 {
Comment (1 line):9 ^' ~6 |! `+ P( Z# n  I. M" s
Rework the uppermost branches on the bald cypress in the foreground.' ]3 O. {6 o- E. r( [2 n* M
! Y( M& B! @# g; A; X, v" [
10)svnlook log # a/ V  B( Y6 Y/ `* q3 b+ _
打印日志信息。. Q3 ]( y) l7 ?
svnlook log REPOS_PATH
3 V' j' u/ g- }7 [3 @  [. }--revision (-r)# z, G/ V; N# a, j% C! f& r
--transaction (-t)
& |0 x4 [  I) N0 ?+ |+ C% D3 E9 R, F' @  C
例子
! F/ n: ]9 `* m- r+ H6 O0 N- \3 ^9 G8 H: |
这显示了实例版本库在修订版本40的日志输出:
0 W+ q( i% Z* s3 }
( O6 ^9 }! ?7 |' t1 X8 E% k可跟选项0 `2 l, l1 }. T+ p% m9 B0 V
--revision (-r)
. y4 i# g/ G& t  ~' X8 f, Z! _; ~--transaction (-t)! M7 ?5 A6 [+ \* g3 H# g

' C: m$ |# n5 p9 R/ f$ svnlook log /tmp/repos/) _- B8 j8 v3 I, d: k/ g/ @( Q
Rearrange lunch.! Q8 V! F$ B' i4 M# i* g  ?1 M# N9 f
+ Y$ t3 v2 l, t/ C. t9 t
11)svnlook tree" b  R2 j) u$ a5 @
打印树。6 g# u. k" Z' m% L5 v
svnlook tree REPOS_PATH [PATH_IN_REPOS]
$ m' {) ^7 h0 Q8 M- \打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。
% w& }: w8 x9 j' A& X' A4 C- T5 ]7 q% ~
可跟选项
8 {; a( x/ z. n' a# C--revision (-r)$ H$ j0 U2 P/ z2 b
--transaction (-t)1 [" T, f9 z8 i+ f: m
--show-ids. k/ h( X' V* }2 j8 H7 O2 \

4 G* G2 g/ Z: p6 _12)svnlook youngest
/ N" L% z+ T: _3 ^打印最年轻的修订版本号。. ?- ]% R; q8 |$ }. X7 @
这显示了在实例版本库显示最年轻的修订版本:
+ ^6 W% N' \! `" V$ U% c
. l5 e  X6 G8 v! ~; e( |          5 x. J1 n& s9 l. g% G
$ svnlook youngest /tmp/repos/
4 n4 @& u+ r, [$ n$ T% u  q* Q- g42, H0 [$ B: m2 _/ o' W) R* Q6 r) W
% G  @1 \0 Y0 ^
2.svnadmin
, `' G- y$ Z" ?1)svnadmin hotcopy — 制作一个版本库的热备份。: ]8 ?, k7 J" p' r* K2 n
svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH
/ R1 y! Q) I! A, U
* M5 r- M4 M. F/ f9 D2)svnadmin dump — 将文件系统的内容转储到标准输出。
9 ]: y  r. s0 i* Ksvnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。
& V9 d3 [9 u% |+ j1 K0 v( f这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。
6 g  A/ J9 A6 N! C然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,
# I  f# I* ^9 _也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。
7 u' W0 G$ p3 _
4 \& W9 F: g) \0 {3 O) ^1 h/ Q转储整个版本库:& V5 e% [$ j0 h0 Y' w

; K, z  s2 @, {1 l- ]0 i/ l3 a5 B$ svnadmin dump /usr/local/svn/repos
1 p# t3 |/ q8 pSVN-fs-dump-format-version: 15 [* v$ r' O- Q* w1 L* i! p7 k+ c5 S
Revision-number: 0
- B4 X( ?/ a! X* c* Dumped revision 0.' _. z" {3 X2 J) m
Prop-content-length: 56
. ]$ D5 w9 {) x! DContent-length: 56
3 u1 a/ P  u: d/ W" m8 v; @- j# q& Q3 F6 {# j" F

1 F1 S  W) A# I. _: ~) M从版本库增量转储一个单独的事务:+ W  m$ u  E8 d

9 v; B) X+ r; }; z4 t4 t$ svnadmin dump /usr/local/svn/repos -r 21 --incremental ; W7 B7 q& \' \" |( c
* Dumped revision 21.% {6 _8 E. s. w3 {6 {+ a& H0 e
SVN-fs-dump-format-version: 19 S( z/ x1 n1 i& q
Revision-number: 21
  n- S( F9 X" M; U! JProp-content-length: 101$ D* W% m& Z7 d/ r0 X  \5 k
Content-length: 101
& f* ?; ^$ E5 `5 W/ d# O' |7 s& ~( T- l1 B7 q  _" ?0 V

( K0 U6 n" _+ E4 T6 J
6 E% }9 t3 P% u5 L! d( [二.hooks简介! t1 t' t. s3 t8 j8 G* G( R
) H8 E) p2 f; x% @
钩子脚本在每个repos的hooks目录下面。' w, u; w1 g; v5 g
每个里面都有模板,名字如下:
8 h0 O- Z- {2 K( qpost-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl
+ l4 {3 W! ^3 mpost-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl. p( C  o$ z- P' h$ Q" ~

! A- k8 @/ K& L/ b" v& G下面对每个钩子的功用 做一个说明!' a0 [+ k" S8 H! B0 A
& J7 a/ [6 _* _) Q/ j8 I8 m) S
1)start-commit — 开始提交的通知
( A! C5 \" q5 p( [9 Z/ M, c描述% X  w) c# v2 ?# h$ }
& F; i% f* S& {$ R
start-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。
3 u4 ^  l) l. @6 ^1 g
" j- Z! ]; {8 T. _0 t2 ]) g如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。& M, q5 }. R9 @$ P: `2 i' l* f# a' c
输入参数# [7 y" n& m! T+ X

* ~; I; Z, v* r2 H4 V: `9 o! ^传递给你钩子程序的命令行参数,按照顺序是:
) ]) O9 \7 i5 Z& i; q" D1.版本库路径# U4 B) n3 Q$ i# S! y
2.认证过的尝试提交的用户名7 E3 l' x( X1 K* S: F6 }/ T
3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).
* l# X5 z6 E. H8 s, [6 v1 T! ^
: f3 v3 t. r0 y" a( Z4 s" Q2)pre-commit — 在提交结束之前提醒。
% K4 ]' H5 U9 I8 U( }/ l* U9 D4 L描述1 E; |6 k, @$ C$ N; @$ y
pre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。, v) @! Z; q* C4 L
如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。
5 ^9 v3 q+ Q$ {& M/ L: @3 u( t0 y& |3 a6 e" K5 O
输入参数, |- h8 w2 h/ [6 s& R  t: b4 t" v

, `7 q2 E6 I* V" q6 c5 g; D传递给你钩子程序的命令行参数,按照顺序是:* _0 W- o& w" P$ J
1.版本库路径, N: L2 [( |* o" U# @; Y( n
2.提交事务的名称
9 Z( ^+ a! [. _  i
% r3 u) D- a8 y5 R$ p/ V& R3)post-commit — 成功提交的通知。
! m% s6 S# r/ l. |7 a! e- ?1 W描述
8 u1 f, O- y6 s! |, [' i2 {/ f6 y: L" z& `1 `
post-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。+ _9 }  [" d1 {9 |8 R
如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。
3 N8 s  |3 ^' I# n输入参数
9 ~" t# E4 a6 n5 h* u传递给你钩子程序的命令行参数,按照顺序是:0 d4 N8 y5 |4 E% ]8 q/ t, o
1.版本库路径  F4 {6 T/ F4 e" g/ u  W; [) h  d
2.提交创建的修订版本号' l, l$ |! ^+ n/ ~" U

6 R+ l$ |2 ~- B4)pre-revprop-change — 修订版本属性修改的通知。, ~# |6 v/ j: n- n6 I. B( H
描述
  M' F, A% O4 B  v/ r8 tpre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。6 `% F2 b% o+ u6 n
如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。! h7 z% Q9 c3 V, W' i; M& Y# I
输入参数- S1 i* m$ R  }* A) |. }- B
传递给你钩子程序的命令行参数,按照顺序是:, w( J" d/ F! X3 K) e6 I
1.版本库路径& B8 l8 n  c8 y& y0 T3 v. @
2.要修改属性的修订版本. j0 H* i; @8 v$ m
3.企图修改属性的认证用户名
+ H. I- T! {3 b# J# ~1 }4.属性名称已修改
; I0 q, A0 y2 C# d5 }" j& C5 m2 g  c5.变更描述:A (添加的),D (删除的)或M (修改的)" F9 n% O  d4 n  c8 ?& D( ]

; \9 l: F, @3 x: x5 x1 N, a此外,Subversion 通过标准输入将属性的新值传递给钩子程序。& n4 L0 U1 p5 N

; z) O, }; }$ O5)post-revprop-change — 修订版本属性修改成功的通知' u& ~5 p7 t# r0 [& W- R' Z: D
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。/ C6 P( f0 V) U* {2 _
如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。- n+ h: C# X6 S1 H& v0 U& _
输入参数& G+ |8 A" t3 K) C/ a- U7 K
传递给你钩子程序的命令行参数,按照顺序是:
+ o  D: P( \: s) c
% E0 `, N3 P4 @1 S" x6 p1.版本库路径
0 ], Q) D6 ?( a2.经修改属性的修订版本
* H9 V: ]- t9 F. A" I3.做出修改的认证用户名
; \# v3 M' G3 d3 H5 p) y4.属性名称已修改/ A& ~8 d* B0 X( j
5.变更描述:A (添加的),D (删除的)或M (修改的). _1 T/ C: Q: }

0 i, V  S. p% a此外,Subversion 通过标准输入将属性的前一个值传递给钩子。8 v4 \3 ]# y5 v/ {. `  L$ Z, D

+ P* b9 u* _$ K5 y+ s0 @6)post-revprop-change — 修订版本属性修改成功的通知# V2 g: Q7 r% q  T! C, Z
描述
% R0 l2 v+ `. Spost-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
% V- Y  ?$ [& ~如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。$ e4 j  @; P$ C7 o0 ^! X
输入参数
9 J0 t8 }$ Y, t7 K! A- s* y) B! c0 |& k: J- Z; }! W
传递给你钩子程序的命令行参数,按照顺序是:
$ u% F3 Q  y* p3 Z* Y( E3 k   1.版本库路径2 q  U0 @! N7 c- w4 c$ s9 O) h
   2.已经修改属性的修订版本
2 B) j: u' O/ G- g   3.做出修改的认证用户名
0 o" ]# Z% T; j' ^' m" U   4.属性名称已修改# s9 U" y' U/ }: a% D+ I' ~& W/ k5 g
   5.变更描述:A (添加的),D (删除的)或M (修改的)8 B' _; m  z/ i" F5 b7 Y
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。6 f* M2 e/ _/ U: C7 |

6 V) x. Y" ~: A- `7)post-lock — 成功锁定路径的通知。$ q$ ^0 ?7 ^2 t( A
描述- k: S# c- q4 ]" ~
post-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。
6 H( L3 {, `- d) Z( s% ]如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。% N% _& e8 u1 V
输入参数' f2 X, g2 P" u6 \. I0 l4 B/ N
传递给你钩子程序的命令行参数,按照顺序是:' J+ u9 p! C; E( t
1.版本库路径& [/ z+ p. c) m8 n
2.锁定路径的认证用户名
! T- N4 r  w% p' H8 P# ]  u* S; {7 L3 n3 f. g, q( q
此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。; t+ f7 b) z$ o3 k+ G5 A1 g0 W

% X0 }( }& Z7 s9 M' h6 j8)pre-unlock — 路径解锁尝试的通知。
" l' W0 K' O3 N. H: S* p/ s描述& Z! A4 e! p- S
pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。1 l* z$ r5 Y" M6 L1 t& _) \2 f$ V3 N
如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。
# E  H/ g8 u, F- ~/ a2 ~) [0 h输入参数
* x, o* J2 W/ B9 @2 t
5 V, G1 B9 c9 ]  b' G, r$ [5 q传递给你钩子程序的命令行参数,按照顺序是:: V2 n/ [0 j- T9 t4 P& V$ i

8 B* }3 f9 C1 h. a6 t$ c   1.版本库路径
; d5 L/ [  a( y) q   2.Versioned path which is to be unlocked
1 _( ~) ?5 T5 S+ P) ^; @" K   3.Authenticated username of the person attempting the unlock
3 z6 L2 M+ W7 Z% b
: F: g! j$ ?& k. O/ F9)post-unlock — 路径成功解锁的通知。
. l, P9 f7 @. x1 F描述  m# ~9 ]& A' v% J) d: l
post-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。$ b" B; j( Y' @6 }; b
如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。" x3 a+ i# k. [8 `  v
输入参数% T6 Z4 h, M  \* S4 S1 G6 d8 i
传递给你钩子程序的命令行参数,按照顺序是:
) c1 g, X" m( [! k5 V1.版本库路径
6 {! C* n5 x8 h2.路径解锁的认证用户名
) b, q6 M: i+ K' h/ X. w+ U$ i# y+ \- ]  W6 f; U1 |
此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。
' t+ d8 ^: l; d9 D; u  y( O/ A; r7 C$ E1 l

/ Q2 l- w8 }; s三.hooks本应用demo- |1 e+ e& C1 b  K
就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。
4 F9 k: c+ g* q/ f/ }9 Z
0 \+ d7 Z0 o$ X" O7 k1.如果不想开发人员有删除权限,只有SCM用户有删除权限...
/ d/ S/ K4 k8 \( u- m9 ]. T
6 Q) [5 h8 o8 R0 o  d#############################################
# I2 f' m+ w' ?3 ?! k3 OREPOS="$1"
. w1 N7 D  O2 t9 }/ C3 |TXN="$2"1 I* T$ j9 i1 G& y3 N- ?
RES="OK"4 |. _' t5 b" W
#USER="$3"4 u: Y/ m) U7 Z. p
Sorry~没有这个变量 呵呵 ( C3 ?8 K  ~- |8 _4 z7 |' v
USER可以这么获取7 j6 B7 I0 P' Y
USER=`svnlook author -t $TXN $REPOS`- [9 J- F' o7 q' P* t4 {/ w7 u
SCMLIST="user1,user2,user3" #scm人员列表0 K# N$ D2 j" d+ C: ]  |4 |
; N8 W9 T9 S6 L
if [ `echo $SCMLIST|grep -w  $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断) O, u5 q4 q! S
then; z. [8 b8 ~- B% ~/ z
SVNLOOK=/usr/bin/svnlook
3 E9 d( q/ x& {* Y2 J; pLOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
5 |1 ~) L$ j0 k. R1 l6 d0 FLOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`! p& q9 u# t3 j% u6 V
5 ^% V* K* n* B; X9 Z! E3 l+ u: I3 Z
if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]5 A: [1 J1 G( n+ c  ]
        then
! f& \5 ^# M8 c% h        echo -e "\n You Don't have the pemmision of delete  " 1>&2( ^2 h+ ~7 c; p8 r. o* y
        exit 1
- q" Z% e* c4 `  Cfi
+ V& C1 c- Z' n  H! _' cfi" K  ~5 q  ~4 p
#############################################
  u' [: {8 J1 i/ I
5 ~) t) o8 h0 Q9 q  ^( T9 M, F( V- c# w9 y' a

# G  R  p$ b3 j. f2.提交完毕邮件通知8 V, Q, [$ E% t' J1 _
http://bbs.scmlife.com/thread-14543-1-1.html
( I+ G& ?+ x& d0 R/ r1 @见此帖子" i4 j) ?7 j) }' n0 J6 ^
3.增量备份  P  l9 G6 Y' F$ c3 [
% j* |% j9 l& P/ k/ ~7 @% w

/ [7 a8 ]2 z8 e4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件
/ L3 }& u) `- j1 Fpre-commit
, [; q5 M' A6 g/ V###############################1 P  ~+ E( w) r+ ^6 r3 ^
REPOS="$1"
2 V+ K6 a( W4 ETXN="$2"
8 l- f: j5 L, x7 Y! W$ PRES="OK"; g+ o7 j3 H2 Z
st="k2/branch/BR-K2-1_0_001_20100316/"
9 v" [6 x! P" v5 v9 VABSUSER=$($SVNLOOK author $REPOS -t $TXN)
/ F+ k' n  b$ o! Tif [ $ABSUSER != "ads" ]
) t- ~; o1 q. q' ^  Bthen, o  J6 f9 R; B1 p' |
        if [ "`echo $files|grep $st`" =   "$files" ]
. J8 b# a& i# X/ M7 F# z        then
" F3 ^- f' i3 v  k; f- D: d& a                echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&21 F0 i* t1 y: I! M; M& D7 [
                exit 1+ S$ G2 ?; v* h- s% U+ l0 ^
        fi
3 P* U; H/ X: J  \. `/ b$ K3 ^fi5 M: ~  X, y2 u, N% B- D  i

$ D- M5 A& f: X' E( O; }8 o1 Kexit 0& f  p5 D1 U/ S; \( c
$ w9 f6 o7 S' |8 v9 g
###############################
* Y; H! T* d8 }( j! Y+ l1 A自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。
6 O/ j, W2 E- p* i) M  ~+ L4 N. V' _0 P2 k& m# `
5.钩子脚本 对锁的管理
9 t2 ]. S3 i" m" Bhttp://bbs.scmlife.com/viewthrea ... highlight=%2Bgo2cxg1 v% `/ |  f+ ]+ c. |! c- m+ U
见这个帖子 有详细的说明。
+ ~* i  Z4 a# W' \8 {; ^# s* _# L. ?5 p, U5 H, C
6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)
7 W+ ^; {1 \: u; G6 mpre-commit
3 F$ {( ^, ?4 G########################################
! F# `3 i) M; HREPOS="$1"0 T9 b) O) b' P$ b
TXN="$2"2 \7 h  ~3 K( M5 \" X3 f) W
RES="OK"9 G3 M- l: ]" ~4 d
MAX_SIZE=10240000
6 H: o- @+ a3 |* lfiles=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')  M) H" U1 E" Z, H" ^! Y) f; n7 C
for f in $files& E! g4 g3 [4 K* a' k8 `2 @0 c1 q& b
do
3 T2 j# x6 Y3 T; E4 w1 m; ^filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)
6 t$ g* P  V  ?/ V9 B- H; j" B9 {if [ $filesize -gt $MAX_SIZE ] ; then" i6 J" Z3 U. h; D5 Q  B5 l  |! w
echo "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr
! M6 n/ u1 K4 D$ h! \2 o5 M2 Lexit 1
4 D! f% T; X, x5 ^, W* |1 Nfi; Y# V4 T7 }7 c8 _5 W
done, z9 }# l  D8 c7 [) v( s8 r. _! d3 C
########################################
" z. d* ?: Q2 m$ a2 O4 E( V5 M当然 这里还可以做一些其他的限制, y! w0 |  C0 G% v
比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制
. K0 G0 ?+ T+ F/ s$ y9 @, Q6 S
2 J6 T2 [0 ~1 r7 g$ v[ 本帖最后由 go2cxg 于 2010-7-2 17:24 编辑 ]

本帖被以下淘专辑推荐:

  • · SVN|主题: 9, 订阅: 1
  • · SVN使用|主题: 1, 订阅: 1
发表于 2010-7-16 15:24:51 | 显示全部楼层
感谢楼主分享$ B0 v0 W! s! }" o6 L4 w
学习一下% {. C3 [" Z& H3 K9 z+ @
svn才刚入门呢。
回复 支持 1 反对 0

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2010-6-30 17:23:26 | 显示全部楼层
帖子比较长
9 C, e# E7 }" {整理的时间较长 大家耐心看!
. a" X+ e  ~+ D1 K: G2 t有需求 尽管跟帖
2 l+ U! p# y8 U$ ^4 d' ]不需再另起贴~
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-7-2 01:26:57 | 显示全部楼层
果然很长很强大!
8 j! d* ]$ O% f' U
5 G0 w0 D6 i! ]7 [. l9 P3 H强烈推荐所有使用Subversion作为配置管理工具的朋友都要好好学习下此帖子,可将Hooks一网打尽,从而实现个性化定制需求,进阶SCM。。。9 }# t/ i+ i0 J- \
! O4 o* g' c( G9 J/ L' |* V3 J  v. A
感谢小光分享经验心得!!
回复 支持 反对

使用道具 举报

发表于 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-6-18 19:50 , Processed in 0.075037 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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