SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 45396|回复: 92

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

  [复制链接]
发表于 2010-6-30 16:43:00 | 显示全部楼层 |阅读模式
钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!
1 P! e, _- T: G( |$ w下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。
6 H3 a6 Z, v/ i5 [欢迎大家跟帖~如果有新的hooks需求,请跟帖。大家一起来完成!8 K* b: b  k+ b( [7 n/ h8 c! c
有个前提,我觉得作为一个合格的SCM,还是有必要学点Shell或bat的写法。. A, X7 `  u: P- u3 \
所以对于看不明白钩子的同学,可以先学下Shell的基础知识。, D9 l1 Q2 B- z- n1 ^( V
不然只是一个理论上的SCM。
8 ?# w7 q& k' v. X& m2 a谢谢大家!1 R' d+ Q5 _. m* Z4 g" l: n4 Q
一.服务器后台管理命令
$ n* x2 a9 B! u/ u; b( z1.svnlook9 m# O% U+ }. n' K
1)svnlook author
# c+ `' o( a* u可跟选项
7 p$ u2 A3 W6 M) c, l+ P5 ^; q--revision (-r)
: C) ]2 t9 u; }. j& V9 ^--transaction (-t)
: m' C8 l, {# j4 W1 P* B打印版本库一个修订版本或者事物的作者。( T. k/ P% C9 o+ Q! |
svnlook author -r 40 /usr/local/svn/repos
+ l: f4 ~: F1 r5 w% V6 A& K
, ~8 K4 b5 T$ r+ f1 _, T
7 d4 H& h9 E" X% \2)svnlook cat 2 c5 v4 D4 G0 g0 [# P
打印一个文件的内容1 J" M' E) r" w: y- d! A% l' h' Z6 {
svnlook cat REPOS_PATH PATH_IN_REPOS
; f7 c5 \: `8 A" F& |5 I可跟选项* o6 X! s! s" _) P, q
--revision (-r)- U3 }' _3 a- \9 B
--transaction (-t)4 i  u- q1 ]6 B# n& I
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README
; x: u9 U6 s  vsvnlook cat -r 40 /usr/local/svn/repos /trunk/README5 C9 q( A* d' E% w6 R- s2 Y8 e
" d2 a) E, P, [6 w
3)svnlook changed' E, J+ E5 f& v, r- o
打印修改的路径。! [' s% C# `' G0 M+ a5 }0 c
svnlook changed REPOS_PATH --最后一次修改# q6 A9 C% e$ b5 s
svn update样式的”状态字符:( F$ u1 \: L7 g& B
'A '----条目添加到版本库。
) g. x4 X4 P0 F'D '----条目从版本库删除。; ~- |6 A' D- r4 V2 @  [
'U '----文件内容改变了。9 j4 g- {5 D/ c% @3 t' q7 W
'_U'----条目属性改变了。" G; m. X& b! \2 q. [8 ^. W% \
'UU'----文件内容和属性修改了。
9 k) e1 b4 Y" Z) d% G0 \文件和目录可以区分,目录路径后面会显示字符'/'。 0 j4 p" C% c+ |1 {3 q( i. P
可跟选项
& Y% D# x4 B$ b--revision (-r)/ R: g- J! Q8 v  L
--transaction (-t), T# _4 A8 ]1 k, }+ p) `: k' c
svnlook changed -r 39 /usr/local/svn/repos
- Q: u( _4 Y, T7 K& _5 J/ c) I' j( I
4)svnlook date1 b, h6 ~4 u+ W2 e. t3 Y3 J/ R5 Y

& p- k6 P: |' P2 t4 r$ svnlook date -r 40 /tmp/repos/
# }5 c  y. @" [4 {: F$ p2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)% M7 P3 n* d/ z: n6 P- G

# A4 K" g* ^+ @: j# W& _# m! M. X2 ^5)svnlook diff
3 J8 K" l( [3 T' osvnlook diff REPOS_PATH% ~7 H2 D  J' [% I4 A7 x
可跟选项
. O8 ^9 y4 I3 |6 l7 k$ v--revision (-r)+ R4 F2 g( e: P0 N* A8 W) `
--transaction (-t)
" Y2 L1 y+ _0 A* X7 T4 i, R--no-diff-added9 j7 X" q6 T! {$ j2 V. c. t. i
--no-diff-deleted/ C, H9 b' j& O) e% k* o2 Y) Q
$svnlook diff -r 40 /usr/local/svn/repos/
* W7 m# B" f; S9 `7 kCopied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)
; [6 B% |% a! A; E4 H- L4 E; d6 E8 F! y4 w0 W5 L3 h$ S2 Q% l% j8 P# v
Added: trunk/vendors/deli/soda.txt
# |; p; \+ X. }- P  o==============================================================================
) H( d6 W2 j( Q( {0 t  Y; A2 d2 ~, \$ Q& t& {
Modified: trunk/vendors/deli/sandwich.txt
- \' L' V9 V! @; g* i# ^; l==============================================================================
2 z5 F; a+ `( R3 q$ B8 u--- trunk/vendors/deli/sandwich.txt (original): O4 _! N/ \9 h. l- [# }" g
+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -06006 x' [3 j' r, L; T
@@ -0,0 +1 @@
- c, c& r) v0 h# q+Don't forget the mayo!
+ K0 V1 E  E( U& W& O# G$ ~: l' R! L3 y1 B, D/ v
Modified: trunk/vendors/deli/logo.jpg6 V: S' E# A' k5 k) R% B2 K
==============================================================================
# Q2 L) D$ Q4 w  m! C(Binary files differ)9 D, i  @' G* l% F. O; P; z
9 W  X+ L8 g  f* X
Deleted: trunk/vendors/deli/chips.txt2 Q* R" u" S6 J0 Z
==============================================================================1 v" D/ {& n: Z! L0 W: f0 n7 g  }
0 Z3 `, E8 O. k  z9 L2 s
Deleted: trunk/vendors/deli/pickle.txt  C4 `! H. p: ?: `
==============================================================================6 j+ q( ?, c3 z) ?
如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。
5 H+ b% t! c+ z, U6 Y
6 C! E* I3 O1 T1 {1 T# ~4 f5 K6)svnlook dirs-changed
5 N7 R! o: j8 B  i" I* u; p打印本身修改的目录
& \( a( b: v- z6 ?$ M0 `$ nsvnlook dirs-changed REPOS_PATH8 S( T' f4 j# D$ u4 G3 X
可跟选项
$ C7 {& A# Q2 @' B# ^' T6 v0 M--revision (-r)7 K7 K$ q) ]5 r9 `! |( @: `  R/ t
--transaction (-t)
# k* h- ]. o; t: h9 }0 |: Y$svnlook dirs-changed -r 40 /usr/local/svn/repos- n4 g" s0 S- d/ j8 d
trunk/vendors/deli/
/ Q( X/ D. l3 E4 B
- N1 a2 U6 f, Q5 _6 u# `4 i! w0 G7)svnlook history
/ [6 A: f3 S7 b9 I+ d% D打印版本库(如果没有路径,则是根目录)某一个路径的历史。
& j. X+ c! N$ s0 ^& m* ^% z可跟选项! Y. Y, w% m6 ]. |; Z- Z- k: l6 J2 b
--revision (-r)
7 f: }+ g4 n0 d5 m3 Q* [--show-ids
8 H9 M- G% h  e$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids- d# T- ?/ U5 ^$ g5 Q& n
REVISION    PATH <ID>
2 C3 U  q5 n, W+ i% Q9 r1 y( X--------    ---------
! c$ N$ R8 z$ e3 S1 }$ N       19    /tags/1.0 <1.2.12>
8 X& L' i: L3 c5 U       17    /branches/1.0-rc2 <1.1.10>7 a$ ]0 R6 X( e$ m6 c
       16    /branches/1.0-rc2 <1.1.x>, ^2 l7 g0 T% Y. G8 F# _' k
       14    /trunk <1.0.q>5 h3 b; X/ C/ |6 }9 H2 s. [
       13    /trunk <1.0.o>5 G+ E# m0 s$ c- e& C; p5 m) P
       11    /trunk <1.0.k>9 h/ a: y9 D1 o" v
        9    /trunk <1.0.g>
4 Y- ?$ I; J& W* D        8    /trunk <1.0.e>
- c) O5 |3 h% C4 k        7    /trunk <1.0.b>
1 f( B: ^; r8 N: u7 F& ?& T        6    /trunk <1.0.9>& c. H  Z) a* O, ^1 m
        5    /trunk <1.0.7>
$ b1 M+ Y# ~3 f7 I' f        4    /trunk <1.0.6>
0 _5 w: w3 W+ n! u; R$ J        2    /trunk <1.0.3>
( a  H: j2 j8 B" ]9 b2 }* o+ V        1    /trunk <1.0.2>/ {) g( t  S% d' ^4 Z
8)svnlook info * _" R+ l% r) W7 v! ?
打印作者、时间戳、日志信息大小和日志信息。
. {+ c- `7 ^; f" D/ v6 Isvnlook info REPOS_PATH" v( `; g: e1 Q) z; h
可跟选项
2 a: d: @8 [( a4 X--revision (-r)
, Z. P6 M- L7 x% s. T--transaction (-t)
! @, N. l3 g' F* X& Q( i$ svnlook info -r 40 /usr/local/svn/repos' G9 M8 T) o, i7 k3 O( c4 h) U+ z
sally
+ R: g5 u: h+ g3 y& N2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)# L. S# h* j! g8 l/ u' J$ @
15" @2 E6 j3 R; H! {2 _* F; j
Rearrange lunch.+ a' |1 k  ~1 N& I" o; Q

3 G7 I! l7 N* |/ J. m1 u9)svnlook lock( F5 f. J' n& q
打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。2 d% _' l& j) O. @+ k" q/ d1 \
这描述了文件tree.jpg的锁定。5 \, G9 o3 _) z+ y
1 _& z2 c: p7 n
$ svnlook lock /svn/repos /trunk/tree.jpg1 I* V  Z  X) N# w; e# }
UUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda8133297535 \/ l4 {% P5 \. ], I
Owner: harry/ G/ E6 Y8 x& D" n
Created: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)- ^3 a, o, A" Z/ U# A+ R- B
Expires:
$ d* p1 P8 Q: B3 _) Y! WComment (1 line):4 R9 @. w; l' b/ L1 O: G' Q% V
Rework the uppermost branches on the bald cypress in the foreground.
: v, {( i$ \9 S: ]  R! b5 i' v3 o! T7 Y: e- [1 j% Q8 S7 G7 c
10)svnlook log ) d* p( y# t0 i0 }; n! J+ C
打印日志信息。
1 m% G- {0 v% Q1 Osvnlook log REPOS_PATH
# R" Q% ^; d6 t' h" u--revision (-r)
( l$ f+ ^. @. h& z* \* A3 K3 q--transaction (-t)
5 K1 L) f6 L. g0 k5 J6 @' y: ~% c5 [9 f! q! ^% [- T3 Q5 A
例子6 u9 b( k  ]2 y( g2 w2 S
1 Z4 t; C! H. p. Q+ Q  n- \
这显示了实例版本库在修订版本40的日志输出:
0 m+ s6 f& W6 R
( X/ m) s8 Y* J可跟选项3 k/ f9 E0 H& q( A/ N0 \4 K
--revision (-r)8 \% n! O; M1 J
--transaction (-t)0 Z6 y' c4 _9 _% L. C

. ^0 z0 h) @" j: F: @$ svnlook log /tmp/repos/8 \! e* O" o& ?" g$ I3 }
Rearrange lunch.
% v- z9 _: F( t6 w/ P+ J" f1 d" P6 Z
! C! T% Z( I8 c; y( M  d11)svnlook tree: Q7 N+ y3 M2 i2 K3 I6 b( X$ u
打印树。
& ]% a) N% `( m. h$ H4 z/ ^0 O, asvnlook tree REPOS_PATH [PATH_IN_REPOS]
& t$ B) N0 q. J: i打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。 ; L" p7 I9 R! d. f2 d, A) a% J

; R3 }* p' U% ^7 l0 u可跟选项0 ^* @! |/ T* c8 R; L* w
--revision (-r)
# y8 z, t- a4 U* `, Y% `--transaction (-t)
" J8 {' y6 k1 O6 Z; ?+ a--show-ids+ F4 u- H/ j6 W. _
6 ?3 ^7 q! a% z6 g4 H- D5 @' d
12)svnlook youngest8 o+ J# K, y1 L" Q7 t9 @6 F
打印最年轻的修订版本号。
. t. Y0 C9 S1 S% R4 u- W& G这显示了在实例版本库显示最年轻的修订版本:
, y4 y1 P- U7 R. X5 x( N8 k  M- j3 y. {3 j. M" _$ g/ Y* `
          - U0 N: s  j- c+ j9 ^6 w
$ svnlook youngest /tmp/repos/ " V; x+ e  y" N% ~+ U5 ]; W
428 O! d6 i' S/ e. ~2 x6 x% U

. U* _) h# o9 [$ m3 e( U7 J1 H6 S2.svnadmin
! y, _- v; ]; r7 z- A9 G1)svnadmin hotcopy — 制作一个版本库的热备份。/ H# P# ~+ }( z  ^4 V$ c
svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH1 P& R" j  _' k& `* r7 D
* {6 {# y. p$ N
2)svnadmin dump — 将文件系统的内容转储到标准输出。
+ F- G3 L6 E! Y1 F8 ]6 K( ysvnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。
/ B4 U/ t/ g/ Q% F3 i* j这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。
9 }3 L/ q$ r8 R; \然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,* q/ ]) P/ w  g4 C
也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。
! L- L' \- W/ N3 A/ Y' r! F" e
转储整个版本库:3 y! W  K- ?6 c: T' ]( p

4 Z" \' j1 g1 r& W5 y. W4 E$ svnadmin dump /usr/local/svn/repos+ u: j0 b2 R1 Q& E
SVN-fs-dump-format-version: 1
/ |' {: V  F! Y0 O6 D/ W- yRevision-number: 0
# \4 i) ^. E6 ^$ I+ H7 F+ x* Dumped revision 0.  z$ [- O; n6 ]  e3 s! R; d
Prop-content-length: 56% T  \, @, F7 }$ f0 ~# @
Content-length: 56
6 |! C7 I$ u. p7 l+ G& }8 F* B) M, ]& B7 o

1 B* f% u. E: o1 U- R9 p6 q从版本库增量转储一个单独的事务:  T/ c7 v& H+ d, a3 ?
1 M0 z  `8 }4 {% [0 z  m: c6 q7 O+ D
$ svnadmin dump /usr/local/svn/repos -r 21 --incremental * Z% @" s0 @! o( ?+ m
* Dumped revision 21.5 x8 v2 ?# k1 e4 F; E
SVN-fs-dump-format-version: 1/ ~( l, l9 Q5 E; l  z
Revision-number: 219 A; U! T( d* U' ?" U: U# ]
Prop-content-length: 101: M  z6 z) _3 x# T
Content-length: 101
( m6 @- l7 _7 T; Y9 {) w8 C
7 W! i2 O/ L$ q, I' [1 A7 h1 p, Z. |: V" O" ^& s% n
& b, x( H" {" Z
二.hooks简介; i1 U" g. h+ d+ t) `% J0 y
+ [6 ^5 c8 D8 W7 K" r+ t* P
钩子脚本在每个repos的hooks目录下面。+ }* Z* Z) O- m3 [6 o1 s; Z
每个里面都有模板,名字如下:3 s- [6 t) F1 }: w
post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl' Q0 u  Q5 W* T3 E/ W4 S" N; w+ p
post-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl
5 p' @2 z- [& @- k" k
8 @* i( l) w# b* F  I, D& Z下面对每个钩子的功用 做一个说明!7 l" N6 h# z0 j9 z: U
+ `& T' @/ o; y- _, H; [+ `
1)start-commit — 开始提交的通知
3 O+ W8 d( B1 n描述0 Z! v; _# G' }/ O
3 Y* ^4 [- E2 c$ k7 Y. d
start-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。
" u7 `) N" j5 F- P9 X- Q8 v! n  }7 X
如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。0 ?' b' b" X5 k# V0 ^! z
输入参数8 }# L; c. Z! Y  D
! c7 p* U  l( d7 I1 g2 \/ q
传递给你钩子程序的命令行参数,按照顺序是:+ r& z# |  B7 m8 E" N
1.版本库路径
' P8 [& h1 y, {4 l  J( a9 v! b2.认证过的尝试提交的用户名& M% @# K% Q, s3 j0 {
3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).
  O7 r; Y3 M6 N4 E* V! s" }: Q1 O) |: r, Q% h  O* [% E: M
2)pre-commit — 在提交结束之前提醒。
; R$ U, ^9 |' s; s9 P描述
& |$ s4 j3 h+ I2 Q* b: ?pre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。
+ @2 @# l6 u( v  ]如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。0 D5 s3 n5 u: s# v" Y" ?
/ W- Y8 n4 c! w+ n) U. y, H+ g" C
输入参数
6 P% r  p* {2 d& f" ?0 J
1 w) i5 e2 H3 p8 B: [8 e4 ~传递给你钩子程序的命令行参数,按照顺序是:" O. N- i) U- b" C! {/ L
1.版本库路径
4 }( J8 z7 q8 D5 H2.提交事务的名称  S: ~2 ?2 I* D: r5 F

$ u& l2 U& m0 m; b7 W( x: [. {3)post-commit — 成功提交的通知。" `8 y; e) T5 P! q! |4 @
描述
0 q7 T4 C, C" C
# H9 Y5 [; h& F& n0 m! ypost-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。
/ X& z1 i- U( E) N! }. f$ N如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。, [* J5 C' G9 C: {  z: H& d$ ]
输入参数
, t& G8 s5 J/ _传递给你钩子程序的命令行参数,按照顺序是:7 ?/ A, t- \, [) m/ d+ i+ w
1.版本库路径2 }6 a/ |) p1 a
2.提交创建的修订版本号9 o+ ?1 n5 D& |* S& r) C3 i( u; m8 h

& T3 i, R8 Y/ s3 n/ c6 s1 K  X2 k4)pre-revprop-change — 修订版本属性修改的通知。$ {% \* J9 q/ M) w1 @- o
描述
3 ^; A1 m3 w1 P4 u: fpre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。
, ?* D0 h& R' \6 \7 n4 o如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。/ b/ \! P- c1 D
输入参数
- Y# e9 h+ N6 Q* S传递给你钩子程序的命令行参数,按照顺序是:1 c! f+ N8 c5 i$ J
1.版本库路径  ?" p7 t5 t, ~1 H  U. c& H# g
2.要修改属性的修订版本( |3 V, m$ i9 `
3.企图修改属性的认证用户名  h+ x& L. U0 x& _  @$ e
4.属性名称已修改
* L" W( V8 b+ K7 B5.变更描述:A (添加的),D (删除的)或M (修改的), F+ ^: d( U3 [( @3 l- {
$ N. z9 s: q, {1 r2 l$ Y; m: N$ n% P
此外,Subversion 通过标准输入将属性的新值传递给钩子程序。
6 V& b" t3 f+ F. M5 k
7 O$ L0 `$ |, [0 @5)post-revprop-change — 修订版本属性修改成功的通知# D9 J, |" }! z9 q, V/ }
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
$ \% P! _9 c3 S5 z9 O+ ?1 Q如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
. x+ D) w; b3 R输入参数
( x) l" W* \: r" n, V$ @/ d传递给你钩子程序的命令行参数,按照顺序是:2 M' X& h+ @- x! r( J/ U
5 T. H* V& x; H2 o3 ?
1.版本库路径
. p2 `- Y" i5 J) ?% ?7 g0 z7 m. d2.经修改属性的修订版本4 t! N" C: J4 z& M
3.做出修改的认证用户名
* N! Q& e# ^! i' A4.属性名称已修改+ _$ j3 G: }" E" o
5.变更描述:A (添加的),D (删除的)或M (修改的)
% [, E  A9 `0 A0 p- x. {- i3 u) v6 d7 l) s
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。* s* {7 X* m  T5 ~

9 [9 [6 H/ S# n! P; {6)post-revprop-change — 修订版本属性修改成功的通知/ B9 s3 B2 y8 V$ A5 D
描述
% H+ _$ Q% m- |. Dpost-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。  C1 V3 Y0 o) h0 {9 Q/ l
如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
* _3 i+ ^/ |( c" r3 l& h5 K输入参数
# [) Q8 h7 E( G6 r# \- C. n: i* D! C1 T2 Q: T4 N0 e
传递给你钩子程序的命令行参数,按照顺序是:7 x1 q7 [- a6 a7 H
   1.版本库路径. W8 O! V5 X* @. Q" Q
   2.已经修改属性的修订版本
. t$ A1 f9 j/ s4 s# t. b/ h   3.做出修改的认证用户名
! z+ @3 g% n7 ~, b/ U   4.属性名称已修改
' }  o( H! D) x: Q   5.变更描述:A (添加的),D (删除的)或M (修改的)7 b2 P' f1 I# A: `2 V0 W7 O
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。% X3 P5 L6 c! h- ?1 K! e
. Q, l  E: c( H+ `3 p% X" l
7)post-lock — 成功锁定路径的通知。
0 z( H- y7 }1 b, {* f: @描述3 i% Q) Q- X5 m/ W' W+ J5 w
post-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。8 {# C& p+ M# A  @2 x  n+ a0 w
如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
* D$ @' D+ D& x. L  H+ B( I6 b3 F6 ?输入参数( ~) [4 o9 C& A
传递给你钩子程序的命令行参数,按照顺序是:% f" K+ |  D- j
1.版本库路径0 G3 R" J, I, l
2.锁定路径的认证用户名; V9 D, j8 j6 ?) f& k, S
* j) P" z1 ~& w- c/ @0 }
此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。
4 S$ M/ p0 Z5 G1 N# `. @' |
* |& v( M: H- B# _4 F8)pre-unlock — 路径解锁尝试的通知。( q  p3 G/ }* p# j  {
描述
9 g6 E5 f0 E* D& f' m# bpre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。
# }3 K8 M: C, Z% N% I! J: X如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。
6 c5 v1 f  x' n3 r! L输入参数
) y) b) G5 R2 G
# n- g, B" W1 G) `2 V' M传递给你钩子程序的命令行参数,按照顺序是:! |/ Z% a/ N3 A) f8 m. C( ~

7 j1 J0 a4 w8 Y3 h$ }1 b) Y   1.版本库路径! X" E, q" C: N
   2.Versioned path which is to be unlocked
. _( F, r/ ?  O# o3 U8 V' t   3.Authenticated username of the person attempting the unlock
$ g7 I/ L& P/ X. {0 \
* m3 g) E8 p( n2 _1 O& J9)post-unlock — 路径成功解锁的通知。8 z4 h* a: b# B3 r9 K% }
描述7 w. v: S. y) P# i$ m! G
post-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。1 ]( ]0 s/ ?9 f1 q8 s; K+ `* i
如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
" l) n9 j7 c8 w输入参数3 p* M9 v1 N4 d+ k, p1 Q- K
传递给你钩子程序的命令行参数,按照顺序是:% r5 F0 Z' Q" f$ E; @7 `2 \
1.版本库路径# ~- k/ n( D2 \5 i
2.路径解锁的认证用户名' v# z2 R# y  D1 ?1 W

; R8 T3 J5 Q( J0 b5 x此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。
2 ?* m, ]" [) w4 \/ p* Y! i1 K" C9 [' ^
9 a+ ]0 c% B, w% Q
三.hooks本应用demo
/ C9 s. B; c, p7 Q8 U$ e! e* r就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。3 d6 A( F! h  O- s: h3 D/ R# J
5 t! L8 o' {0 ~; Q: a6 d' F# F
1.如果不想开发人员有删除权限,只有SCM用户有删除权限...
6 |/ ^2 N0 s% d8 a- v. ~" o# G6 D, Z) r' y5 d; B$ ?) p
#############################################
1 i& y6 w7 W  [* f* kREPOS="$1"3 q+ j* {. g: _
TXN="$2"
0 r) u$ ?4 N' I# G* B" G% [5 ARES="OK"
2 A( E1 O  W# U9 T; b& F#USER="$3"
0 q7 X5 ?, q' WSorry~没有这个变量 呵呵 # s+ s$ N4 D* r, f$ `0 @
USER可以这么获取$ a' |# f' S# H" ]& d
USER=`svnlook author -t $TXN $REPOS`
9 p7 p8 |  U( `& ?SCMLIST="user1,user2,user3" #scm人员列表( @1 L; i4 ]2 L7 j/ ]% A! q1 e

" q. b7 r6 E; N* aif [ `echo $SCMLIST|grep -w  $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断
* J8 T% i/ V( ithen
; k% o0 _5 D7 o" U7 HSVNLOOK=/usr/bin/svnlook
  ], H4 y4 }8 a% YLOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
& g* H+ l. I1 x) }8 }LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
4 y4 C$ v* W) p* H) y% y4 v7 b4 _' G
. p8 t% g4 W8 p! w( wif [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]8 i$ g4 y" _! E; [/ q6 g; s
        then8 p8 O+ c2 z! \. M& t6 W
        echo -e "\n You Don't have the pemmision of delete  " 1>&2
& m2 y" k2 Z8 \, C- }; n        exit 1
6 n) s% R& x. q! y5 ?fi5 b/ Q0 |7 f3 t" e4 J; R# |
fi' f! W  W" q8 \& D5 h4 {
#############################################
% d2 J; K) s+ V+ a8 D6 |% v
* O2 y( E. w7 Y& H- y. `1 X" V2 v& y5 X8 W$ \& D' {1 L0 F9 D

" m2 W5 S' x; [1 a! P2.提交完毕邮件通知
, v) Z4 f! |2 e# @: zhttp://bbs.scmlife.com/thread-14543-1-1.html& h( E' B2 |/ u- D4 b$ f) k. K
见此帖子0 F; b. h* h) B+ U9 R
3.增量备份
! Z0 x3 _; A4 V" l8 t8 c/ J" w1 |4 D
& h; `& O& V' J/ C# S
  o. f: Z1 ^6 L  k" t4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件1 A; s. [. X3 t7 S
pre-commit
5 E# r; T$ W" C" t3 u8 i###############################
* K5 x( L8 S! h& ?9 S7 MREPOS="$1"& y/ k! u1 O" L8 q7 E1 g
TXN="$2"
3 y  z9 L6 [& X" c$ P$ LRES="OK"
' m( i# `5 \4 m* N  zst="k2/branch/BR-K2-1_0_001_20100316/"
+ u( I& j# l" x; N, _! C, j& lABSUSER=$($SVNLOOK author $REPOS -t $TXN)' U, M+ ]2 |: w4 X
if [ $ABSUSER != "ads" ]& N( s3 F; Y4 p9 l1 K  p
then# y; R( i. D8 T: A& Z2 @& H
        if [ "`echo $files|grep $st`" =   "$files" ]
1 q" C6 U4 y' e        then0 n* K, C; A/ y. V" M0 d1 _" e
                echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2
- O( R; G, z" R  E                exit 1
( ^, V: k* x; d( p0 `  g6 @; [4 r        fi
8 k& ?. q7 W5 S! N$ t& C# `. P  kfi
: o+ N6 T. E, f* K7 \" M
. F6 R4 E6 `) J/ o- G* L; u& vexit 09 i" S( @6 M' @* W
1 m' o" Z9 `6 b4 K4 f5 v( m
###############################' d( O1 e3 x9 G! n: m0 H5 ]
自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。' `6 r: V# x6 }! {+ r3 m# u) l2 Q
7 H1 [4 r, u, G
5.钩子脚本 对锁的管理* ?3 a6 ^( [& A
http://bbs.scmlife.com/viewthrea ... highlight=%2Bgo2cxg9 _6 x9 f6 J" D  C! j- ^0 U
见这个帖子 有详细的说明。
2 w: s3 N- R/ X* z, H9 p$ N$ n/ w- @+ ^5 m/ z; F9 y. j5 K' k
6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)
0 D$ ]9 y3 y0 U* qpre-commit5 L& e* I' y, W' A3 B8 {$ \
########################################1 K" N. Z( C$ X1 N; n# ^2 B
REPOS="$1"
; A+ u* X" n! @  k8 ?" C% wTXN="$2": v: i1 u6 b3 }) @7 l5 ~$ d( X
RES="OK"- U* E9 r1 C7 z. ~
MAX_SIZE=10240000; y8 n/ m  y7 e) S3 _" n$ z$ L* R
files=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')6 D  g. U9 Q9 K6 `  X
for f in $files
- u! N; O. l0 r7 ?4 U& Ado- }. Z; ?1 ]" q) l' F
filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)' a% b! O# Y) K5 x
if [ $filesize -gt $MAX_SIZE ] ; then
& v4 @/ Y$ q& oecho "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr
/ f" `  }* N0 ?) R" |9 T. Aexit 1
8 V9 d! ~. O$ E5 y, r) W7 y9 Qfi
+ r2 \' {+ O- w1 w+ ]3 c6 Hdone
$ S/ O! x8 @& Y! K; I' E########################################
/ b0 a0 W: _5 u8 v8 b2 W/ y当然 这里还可以做一些其他的限制
" O& v- C) J# `1 v, i7 Q比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制
/ e  f3 w" {$ c" v/ @- b0 a! W" }6 G' W. R* H( P2 M) q
[ 本帖最后由 go2cxg 于 2010-7-2 17:24 编辑 ]

本帖被以下淘专辑推荐:

  • · SVN|主题: 9, 订阅: 1
  • · SVN使用|主题: 1, 订阅: 1
发表于 2010-7-16 15:24:51 | 显示全部楼层
感谢楼主分享3 V- A0 c3 d9 C* k
学习一下
% m! s% Y0 k* _0 r2 f2 Osvn才刚入门呢。
回复 支持 1 反对 0

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2010-6-30 17:23:26 | 显示全部楼层
帖子比较长
6 T$ K; G" M, ?整理的时间较长 大家耐心看!
3 U" t+ l, R$ j! B* j有需求 尽管跟帖
) V9 ^( _+ H/ J不需再另起贴~
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-7-2 01:26:57 | 显示全部楼层
果然很长很强大!
5 q5 P+ `9 Z) u- C% C2 L* O  c5 m+ M+ c
强烈推荐所有使用Subversion作为配置管理工具的朋友都要好好学习下此帖子,可将Hooks一网打尽,从而实现个性化定制需求,进阶SCM。。。
! K+ i; y& P& j1 Q) u4 U4 K- B" g% S0 J6 @# [+ X/ z
感谢小光分享经验心得!!
回复 支持 反对

使用道具 举报

发表于 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, 2018-11-13 09:42 , Processed in 0.077928 second(s), 8 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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