SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 43620|回复: 92

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

  [复制链接]
发表于 2010-6-30 16:43:00 | 显示全部楼层 |阅读模式
钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!
9 b# ~& S1 z6 s- @1 B* |& ~6 g下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。
; K; Z" T# b: n7 l) H* u欢迎大家跟帖~如果有新的hooks需求,请跟帖。大家一起来完成!
2 i/ p; h3 J) s8 @0 K6 m有个前提,我觉得作为一个合格的SCM,还是有必要学点Shell或bat的写法。
9 `, J9 L+ W: Z6 Z& p' D; ]! p( {所以对于看不明白钩子的同学,可以先学下Shell的基础知识。- f& K7 |; n/ G, L3 n8 A
不然只是一个理论上的SCM。* i9 O: _( c6 f: E- B- [0 ^8 y
谢谢大家!
' F3 [+ ?  e0 u) ^+ h- g2 \一.服务器后台管理命令3 e  \1 s9 Q- p# o! C
1.svnlook% z, ]) U* t/ D3 x% t6 }# }3 n# i+ v
1)svnlook author * x1 M: P$ U+ Y' {9 w' i. t
可跟选项+ `/ i% @  f% s. ?0 ^
--revision (-r)
5 w5 @9 J. n) u* T0 f+ O--transaction (-t)
: D8 R5 u* o2 d$ d打印版本库一个修订版本或者事物的作者。
) V3 W9 y; U- D" n* m6 B: usvnlook author -r 40 /usr/local/svn/repos
4 P8 i# |# u6 z; x9 S: k' Z3 {9 ?  ^# |, E" O) a8 }

* Q2 W4 b# Y+ @1 H8 y2)svnlook cat
  J4 T9 h! W! |* `打印一个文件的内容
2 g5 J. z6 |8 N/ R" l/ Isvnlook cat REPOS_PATH PATH_IN_REPOS% n1 F3 ?2 g4 N
可跟选项
% k7 I& o8 O* q0 L--revision (-r)+ x6 ~  u) o0 d0 I
--transaction (-t)5 E% ]$ Q; f) r
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README
# F% r0 F2 Q4 k: `7 |4 W+ `svnlook cat -r 40 /usr/local/svn/repos /trunk/README
$ m. i5 ?  g# {0 [! G6 z
6 ?; n; W" m4 R+ i& C3)svnlook changed- H, `5 k4 D5 r* ]" c
打印修改的路径。8 o5 }; ?* P/ f% d: c
svnlook changed REPOS_PATH --最后一次修改0 s% n& C$ O! @2 K# u+ n
svn update样式的”状态字符:
8 B0 v% ]& i" P; j. u'A '----条目添加到版本库。
; t4 C( {9 W3 C6 L'D '----条目从版本库删除。
# |' S$ U' J. W3 I6 i/ c: W/ e'U '----文件内容改变了。
( T( Z$ |' N% q/ a! L'_U'----条目属性改变了。; K4 q3 ^* w' s- m
'UU'----文件内容和属性修改了。
0 b/ r  o. p* H( _' a! ]6 B文件和目录可以区分,目录路径后面会显示字符'/'。
1 C) w& j+ t/ K- J* ?可跟选项: J+ _$ `' D1 y" J: y7 g
--revision (-r)
2 m" R3 b6 X! ~/ b- l" h--transaction (-t). s& ~9 Q" h) S+ |( e
svnlook changed -r 39 /usr/local/svn/repos9 m  n0 i$ L9 c: x. J
  P$ n# ]5 A) \7 `  Q" y
4)svnlook date+ p' V6 s' o( @, R$ O
% \; I0 l4 ]! f9 G# |. o
$ svnlook date -r 40 /tmp/repos/
' |& d- n# i) b5 |: m2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003). [" X4 C; `& z5 F1 x  S# t! q
8 F) g  Q9 S, j0 U
5)svnlook diff
. c; O4 c) l; J3 [* h) H" ~+ T" {+ w  w8 Bsvnlook diff REPOS_PATH
8 {/ n) P* u8 b, j6 W可跟选项
. H' Q$ {4 F- p: [5 W4 X2 r7 w--revision (-r)3 y# C0 m  j/ Y
--transaction (-t)
/ G- v4 F3 i+ b' m# y--no-diff-added9 n4 s- [: z: |$ z/ l
--no-diff-deleted
. S5 E, A5 q6 C. w4 g$svnlook diff -r 40 /usr/local/svn/repos/
4 N4 g/ Q. g& H% h. |  ], hCopied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)6 D. F! w0 Q+ u( M: E

% @' k1 i$ Y! u! j, B, K; E; cAdded: trunk/vendors/deli/soda.txt
1 K; t0 f8 p7 w==============================================================================9 k8 g. P2 y1 T

8 E3 V& B: u# K  X# @/ dModified: trunk/vendors/deli/sandwich.txt
/ [$ t6 h2 Q3 V/ F8 P! @! x1 [==============================================================================
/ o) L% L* f. {: ^4 W--- trunk/vendors/deli/sandwich.txt (original)
5 P. q5 `9 b9 t+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -06004 O. T! T8 {' n0 ]+ _
@@ -0,0 +1 @@
% g* @- f9 @- q, F- r+Don't forget the mayo!6 S" i+ H* Z& J; F7 S% |  p) Q) J* @

( A& K; Q5 f$ S! v4 Z* c) OModified: trunk/vendors/deli/logo.jpg
9 W! L# S# j! }2 m4 B==============================================================================, m, s! @! e% D; z6 t# x9 A
(Binary files differ)
  `  p% B  b) ?! _/ o+ |8 k$ j( y. y) W+ q. `* R! N
Deleted: trunk/vendors/deli/chips.txt
/ j; C$ A( A; I) k==============================================================================4 \# Y: ~0 w/ t: h; W& o: u& z
- i1 i. V8 w1 k: _/ d4 S
Deleted: trunk/vendors/deli/pickle.txt& E7 R% [" G3 X8 ]
==============================================================================
, _. W4 D5 ?( \* t4 [& m/ x' `* G如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。
! K* T3 E0 J4 N+ o& L5 j; w
5 V  g# x: k7 ]" h: \2 A0 R6)svnlook dirs-changed
) \9 ]+ w# X" d! O8 g4 `6 `3 Y7 d打印本身修改的目录  ?$ v( F5 I' u2 w% o' b
svnlook dirs-changed REPOS_PATH
5 n/ }) e1 m" B6 M可跟选项9 g* P* `4 {0 n8 K) i: ]3 r
--revision (-r)
4 @( E* X3 r, G3 c$ l--transaction (-t), s# Q9 i: k; ?9 S" A8 D
$svnlook dirs-changed -r 40 /usr/local/svn/repos! f6 ?; e' h/ s# k+ z/ N( @: u
trunk/vendors/deli/
6 G2 Y- n$ v- a) ]7 k6 B
( K: l- v( w, A# o! s3 |7)svnlook history
4 W6 L8 R8 i3 b$ P% {% M* x( e1 N) T打印版本库(如果没有路径,则是根目录)某一个路径的历史。) i$ w. Y1 B, R
可跟选项4 L/ t1 T& a0 l5 m1 V
--revision (-r)
; r' c% q; W) H) K+ Z% [5 }* r* H--show-ids
( G8 v( ^7 O) G3 n6 }0 g& Z$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids
2 i5 e9 f" s  ^- R1 v% xREVISION    PATH <ID>  J# _' U! F1 q. F' C9 w  r
--------    ---------
8 m/ e6 j/ }# a3 A7 M       19    /tags/1.0 <1.2.12>
- D6 l' G5 v& t. ?$ s       17    /branches/1.0-rc2 <1.1.10>1 _# V; W5 S  B, e
       16    /branches/1.0-rc2 <1.1.x>
9 R3 w- }( @4 Z, Z& ]       14    /trunk <1.0.q>+ K! B0 L0 {/ k, \, Y1 M2 E# f: N
       13    /trunk <1.0.o>
7 W& O6 A# e0 Z7 C. x4 n/ ~5 f$ R       11    /trunk <1.0.k>
2 L/ H" A* S+ W- z" w" x1 ?: _! z        9    /trunk <1.0.g>
9 A% K  u4 Y- G9 j, C0 l& {        8    /trunk <1.0.e>
/ {6 w3 a4 }3 o% S3 p        7    /trunk <1.0.b>: a* y- l* n9 Z
        6    /trunk <1.0.9>! D  Z1 K/ Q3 x% I
        5    /trunk <1.0.7>
) W- j7 l" o. F6 \! u& {- x* {7 i        4    /trunk <1.0.6>4 F, J5 j5 I$ e6 `
        2    /trunk <1.0.3>
2 o+ V. q3 r4 \0 i. b# i; o        1    /trunk <1.0.2>: t0 Y, e9 `; D* Q8 E) Y9 l
8)svnlook info
: e) V: `# o- J& H打印作者、时间戳、日志信息大小和日志信息。 / {/ r7 Q6 D1 P
svnlook info REPOS_PATH
4 |7 P! k3 ~* H+ S& k' C: ^! Z可跟选项
' ^& N, S: Z9 C--revision (-r). d- e/ N0 n% M
--transaction (-t)2 k. E: `. Q& U) c
$ svnlook info -r 40 /usr/local/svn/repos
6 \% |: z% I/ S) Z$ b: Y0 B# r2 F9 bsally/ P) Z3 `4 w( x% P5 S4 n
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
% c+ p% f4 k5 Q. r, [% W154 L" {1 R# w; O) h
Rearrange lunch.
* A8 F2 X, n/ J1 k5 Q8 p4 Z5 l0 Y. z( O9 \+ |+ P/ y, ]7 l! Y/ |
9)svnlook lock
$ W, ^: I! A! q6 w打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。- L- ^$ o$ @9 J4 q  d+ C- `
这描述了文件tree.jpg的锁定。, z" m; w4 @$ J3 |! b

6 E9 v$ M, Y5 _* E1 x* G; g$ svnlook lock /svn/repos /trunk/tree.jpg
- f% D: v. L) u2 T9 u" D0 |UUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda813329753
7 W: L) B: N- A. Q: M; TOwner: harry
4 G% v/ A1 K( S1 ZCreated: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)
* C& ^7 R5 A8 B9 K6 wExpires:
- I$ y3 A  [3 g( @. qComment (1 line):+ O3 B; x7 U7 w6 {; o
Rework the uppermost branches on the bald cypress in the foreground.( n9 c' N6 v" ~' X4 `

* B% T5 s) Q6 X  \8 h10)svnlook log
, u. O6 U9 v: v. U3 p8 C' |  @打印日志信息。
) J/ S6 p4 z1 V' O: u3 v. l$ Gsvnlook log REPOS_PATH" E* c+ K" p& a  J# y
--revision (-r)
* R/ k& `9 V$ w# C--transaction (-t)
( a: p  c! f4 E( o' S; \
/ Y  ?/ @& h3 d, U例子
: X# i! w- R3 h$ J# v( d  X2 Y4 L6 o) L
这显示了实例版本库在修订版本40的日志输出:
( J( i# n  X0 j- g) ~! F) |# T
  n4 q0 B$ e8 t8 X可跟选项
3 }3 P$ y/ F" A1 X--revision (-r)/ e4 s  C# N$ v) C& ?6 D
--transaction (-t)
* K5 Y5 p- [' n8 i* Z  f
% t* y& y3 u5 x' q$ svnlook log /tmp/repos/1 `1 O' n/ C0 t  ~2 u4 |+ A7 V1 k9 k
Rearrange lunch.4 ?' ^$ d! h9 q1 h  b2 T
5 C' O  [6 `7 ]
11)svnlook tree+ `  b' h0 Y# D+ N
打印树。
! K- ]) A  ]- O6 ]/ rsvnlook tree REPOS_PATH [PATH_IN_REPOS]" N; C1 R" a4 J" R
打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。
! V/ U/ O) F* {/ \) C! D: S- \7 i6 e$ x% o
可跟选项
6 h$ K1 |9 G/ J" B3 z9 Z7 i: ~--revision (-r)$ m! ^' S$ m0 o, T2 ~( }
--transaction (-t)+ C+ p  W; h0 R+ f7 K  o' }5 w
--show-ids6 X& n" C) T  k( e
6 f0 Z) x" n. I1 Z; v+ m$ W' D
12)svnlook youngest  w+ m: X& K7 D; _
打印最年轻的修订版本号。
6 B- X% [% D0 h& z* G3 G8 d4 N这显示了在实例版本库显示最年轻的修订版本:7 K7 I; i" B7 a" ~" c' e9 g

: A6 A+ T! e  N: ~1 d- G" ?          7 u# C5 p2 a+ T. A! ]$ |( Z9 d' Z3 G
$ svnlook youngest /tmp/repos/
# G& p% l4 ^; P42" ~* T  p* o9 G" W5 W. C

2 i$ z/ a9 o3 A) P8 }$ w2.svnadmin/ ~3 H) z8 Z: N9 r; P4 E. J; \6 t
1)svnadmin hotcopy — 制作一个版本库的热备份。
5 r' x* L, p" u+ @9 f' b: x3 psvnadmin hotcopy REPOS_PATH NEW_REPOS_PATH: u$ `+ X! E; e

9 P0 Y- F6 f3 g9 R9 q2)svnadmin dump — 将文件系统的内容转储到标准输出。  ?2 T& G& G+ `& F: M( U
svnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。* c1 o1 T6 y% m* s0 `
这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。
9 `* C2 D4 ?) H! c然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,, R) A0 Z! y9 W. j. ?; |
也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。
; g4 j* b! q3 k5 y
9 Y3 N* O" `( o' ]6 |转储整个版本库:% O4 J! f0 M" _; ?" u
$ F4 |* U+ Z+ y  ?2 W
$ svnadmin dump /usr/local/svn/repos
) ~/ D$ w& n* |SVN-fs-dump-format-version: 10 R) i' Z$ F  L' `0 n6 R
Revision-number: 0! B& ~2 T& K, K* ]  z! Y
* Dumped revision 0.
/ i( L! n8 K# J7 ^4 v5 _' |) ZProp-content-length: 56; |$ Q9 F8 v9 \) }! ^
Content-length: 565 v: q( t0 d, ?
: T" U3 K9 C! I

2 Y& T0 [: {/ t9 `+ k8 {从版本库增量转储一个单独的事务:0 L4 [4 S/ h8 U: D) z% G

  |( j  B. X7 {" R9 q+ s1 g1 b$ svnadmin dump /usr/local/svn/repos -r 21 --incremental
4 E* T# \7 n) a1 p# p1 L4 I* Dumped revision 21.
4 i- F+ w0 [; j0 u- gSVN-fs-dump-format-version: 14 n" O' C" N" D% x9 f
Revision-number: 215 x, a3 D  \" H( ^! `
Prop-content-length: 1010 Z* ~5 c1 b' T) [8 @/ \1 B
Content-length: 101
6 r0 H3 o  `; q% r6 h
* @* G% L3 A1 l3 r) [0 i+ {. K/ e& `0 ~
3 j, d; z5 Q( R; R% \1 K
二.hooks简介
( w6 Y, e: N$ T
- H2 y6 I/ |0 m1 }' G( l" [钩子脚本在每个repos的hooks目录下面。
7 f& b  z$ O; K. J0 B' U, T每个里面都有模板,名字如下:5 k, ~6 m0 k+ ]) p# m3 z1 L( q
post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl$ P" G2 `2 T. U+ Z
post-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl/ V. g! S3 t& E6 V7 e

; A. b- H0 |7 }下面对每个钩子的功用 做一个说明!
' ~: y3 |& s0 Y0 Y: L' K+ P8 \# Z
1)start-commit — 开始提交的通知
3 U9 T' `/ T% J3 y描述3 z% D. q) z( n2 h
/ R1 A* k$ \& O" Z! c& z& x
start-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。. u2 K  [6 c" V. @7 T

% H8 @! ?7 }1 U) S如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。" t& K) a+ s4 Y9 m1 x( [. p
输入参数
! N, E0 i- v1 g" N! G. m) K# Q  ?- ~% I3 n7 |
传递给你钩子程序的命令行参数,按照顺序是:! l) q9 W) M2 c7 L: p3 X* c( v* U+ q
1.版本库路径+ U, U) [4 B% |8 g  P4 \" \; M
2.认证过的尝试提交的用户名, V# T- u3 u+ q  `: @. H( z& F, G
3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).- D0 k# K- E, s3 e% V* g! _

+ k! h5 |" [% i2)pre-commit — 在提交结束之前提醒。/ S7 ?5 u' P' J0 u5 \
描述
5 x8 ~( [- M  M% ]3 t& @' S  }0 opre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。5 O  }3 X- j+ A  t/ L" G2 Y# F
如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。" h2 m( M! F7 H# x/ ?/ t: h6 z& O- v

. |& L: }- y. e/ @6 w: x输入参数$ Y( h" q6 o$ {/ {+ e/ \

7 N7 L  f$ }8 r, D& x9 d& T传递给你钩子程序的命令行参数,按照顺序是:/ q6 G; t) z& `$ ]& C3 f/ {
1.版本库路径. \; I" E8 {9 J9 R$ q: s& X0 f$ |5 |
2.提交事务的名称
# j  O0 K/ D3 K+ t* S( \5 ~% D' `/ Z- K7 |5 B
3)post-commit — 成功提交的通知。, G7 x) a3 `9 h! x; J) m. v- S; P
描述0 r; R; h# X+ O8 j  C

5 Z" Z- g* C6 S0 b- r: `# s1 |# Ppost-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。0 _2 R' c4 n7 K2 V7 A
如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。2 _, _& L: z8 G" J1 k$ y/ u, |
输入参数
1 H2 i$ l1 c  v1 V0 ^6 i' C- T9 R传递给你钩子程序的命令行参数,按照顺序是:
- h5 \+ i# P& `0 l+ [; l6 ~1.版本库路径7 t: Y' p, g) ^
2.提交创建的修订版本号
) ?  s* K) s$ M0 n) e1 v" h3 Z' q4 s
4)pre-revprop-change — 修订版本属性修改的通知。' n3 Z8 [, u: |, L. i0 x, [+ J
描述& ~1 a; j) r1 T0 s$ m
pre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。9 `# t1 H, A) T* \# ~* |. t: A/ G
如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。
/ [  S2 Y7 N6 i. F* o. T+ C输入参数( m# ^, ^3 L1 T& H  X3 [- d! r
传递给你钩子程序的命令行参数,按照顺序是:$ }2 c& j( f4 m" Q& j6 @
1.版本库路径
7 E& M. b/ S( I2.要修改属性的修订版本
1 U" H: I7 }9 U4 Y; P* @# M3.企图修改属性的认证用户名0 X# E. S. V' t8 P
4.属性名称已修改
6 u3 V5 r. d; W; b( d! a/ j$ Q8 c5.变更描述:A (添加的),D (删除的)或M (修改的)" t7 D: F8 ^, t; N8 M: g# [

$ f9 ?% [) g, B1 J5 {% ^此外,Subversion 通过标准输入将属性的新值传递给钩子程序。
. v' q9 S! F5 c& ^. N
. s  D9 n! g3 y2 a6 ~5 H5)post-revprop-change — 修订版本属性修改成功的通知
0 o( c. [3 r3 fpost-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
2 a& n! D6 j  G7 Y( z! ?如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
$ V- q7 t2 b& F" U$ M- s9 M0 y, z9 }6 P0 X输入参数
1 S9 A+ J# K: G6 s传递给你钩子程序的命令行参数,按照顺序是:
, ?& |% |: m! p6 G: z7 K4 S* ?3 t- Q* q9 `, r
1.版本库路径
" b& R! z# }, |( e+ X3 ~2.经修改属性的修订版本
9 S* O0 x$ A  P2 g: v3.做出修改的认证用户名& u$ S8 N  @8 y) R: I) n1 y* [
4.属性名称已修改! y: ?- ]/ o% X5 F# g9 Z- _- v
5.变更描述:A (添加的),D (删除的)或M (修改的)  J1 M( k& i( ?& K5 _
: }4 b- |  S  [& _; g9 z
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。
1 c5 P; N1 Y0 q) h3 u! R' A* g6 L: M" e4 |& q9 B
6)post-revprop-change — 修订版本属性修改成功的通知) Z( S, @( S& X5 D
描述
8 s" l0 `  N7 U1 I3 E$ Y5 Jpost-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
" @0 ]: f, K" F* d% R如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。  O* p# I2 Y3 l- `' u  ~7 l
输入参数
! d; F7 v7 E# L* a  t. J' F# I; j0 V- u  `8 S0 Z' V
传递给你钩子程序的命令行参数,按照顺序是:
' K  K5 n, I* @' |$ @3 `   1.版本库路径
; {% B' s4 I& U4 w   2.已经修改属性的修订版本
! t5 `$ y% K3 r' l& m" {   3.做出修改的认证用户名% _0 d. c* [& C+ z
   4.属性名称已修改3 B  g* r" `" ?) F: f4 m
   5.变更描述:A (添加的),D (删除的)或M (修改的)% y* B7 A8 p- |9 w7 f( u9 m4 i/ U0 `
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。, E9 _6 }$ J0 t8 s; L, A/ `

0 A, n" _) C5 d( P8 `& `/ V2 K7)post-lock — 成功锁定路径的通知。
5 F6 D& M1 f3 c7 {4 @  `描述
: V5 R+ t9 f; t  spost-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。
1 X8 m0 J4 P8 L+ d8 d0 e0 X; I如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
% u* P4 N! \5 s( a输入参数
9 Q8 b+ U  C% Z+ O; f! P: c传递给你钩子程序的命令行参数,按照顺序是:) `8 e3 m# o* q% @4 H" q' O4 I
1.版本库路径, N1 _3 Y' O# h
2.锁定路径的认证用户名
$ {: ^* r" Z; V# y
9 s0 o0 ?  k  y+ _此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。0 j# J" J, _( ~# a; W, |, V

7 r, R+ a4 |' t! z- Q8)pre-unlock — 路径解锁尝试的通知。
8 S7 _, Q2 r3 O9 s2 o5 y2 W8 P: b$ t描述7 ~9 o7 k: J9 p/ O9 M
pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。
! f* W0 @. d8 |8 {, O+ R+ Q2 c如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。
0 z4 H8 ~2 [' ^) l  A" D输入参数* z7 @" o3 q" |/ Y0 j! p0 r

! M! D4 G" W6 [2 f( H  ^8 A" P& U传递给你钩子程序的命令行参数,按照顺序是:
4 P4 |, P! E, Y2 T  i1 ]
2 @( u+ T; c7 }3 |3 P+ e; k8 ^& K   1.版本库路径
# }9 L7 c/ U: `, r   2.Versioned path which is to be unlocked
7 m0 z* a4 Z% y6 k0 D! M   3.Authenticated username of the person attempting the unlock
0 D. l9 H6 F( `# ]+ I9 P- v; Q7 ~" K$ u+ X9 l
9)post-unlock — 路径成功解锁的通知。
2 F( R/ M, X5 D' I+ j描述
- d: g, Z9 u/ }9 L; Rpost-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。" p) y, N' G. ^7 Q/ {3 G. v4 J
如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。7 q5 X6 I+ f* G. ]! F
输入参数$ u! I, H. x6 y6 O( W5 Z0 w
传递给你钩子程序的命令行参数,按照顺序是:
, u+ g9 \# n; c/ k( G1.版本库路径
, d. D2 I* v+ M$ \- z2.路径解锁的认证用户名& [( k. D; Q2 Z$ k8 e$ w# \

# r- O* G* y, R) a此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。
; N3 T% U( o/ N7 X7 ^  D* C) B# K! t1 N, y$ p; m& K* r! e
# N3 ^4 F2 q4 ~
三.hooks本应用demo
6 |8 P; A3 d6 Q/ y8 @( l9 F8 W就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。
8 Y0 u# B2 [8 }5 p3 B0 N
; y/ K! C8 K1 K% [. v1.如果不想开发人员有删除权限,只有SCM用户有删除权限...
7 w3 I8 X* J2 x7 h; G; ^4 O) o% |; I  {; U; Q
#############################################% r& L5 H: v4 f6 g8 C8 ]
REPOS="$1"
4 q: M: R2 L5 h: r" [. }6 VTXN="$2"
4 s1 b& z( b0 ARES="OK"' S# }4 Q  m4 ]
#USER="$3"2 b2 w5 ^2 h" ]! J3 w$ |( _
Sorry~没有这个变量 呵呵 - }6 d$ b& P# g  w0 Z& ]
USER可以这么获取  M7 P9 A( S$ Y$ u# f( y
USER=`svnlook author -t $TXN $REPOS`
; Q* Y5 D4 W0 s" _, V4 p+ R, JSCMLIST="user1,user2,user3" #scm人员列表: ^1 g1 i) [& S' \3 T5 L# G2 K

$ E+ z- A$ |4 Cif [ `echo $SCMLIST|grep -w  $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断2 q/ B+ _2 K7 V3 {' n
then
; I0 x: E6 ]# F' [: E2 H; X. R5 dSVNLOOK=/usr/bin/svnlook) x* U# k9 G( u( Q3 L
LOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
% y# C2 D# B2 b8 J/ W; r' zLOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`8 L5 _; O; X; ^7 ~& I4 q
  [3 U3 J+ Q4 U& s$ q8 V9 B1 v+ S1 u
if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]
' ^' p9 ~, ]4 C0 ]+ q2 @        then9 s8 @& l' u: k% |0 k1 k' Y
        echo -e "\n You Don't have the pemmision of delete  " 1>&2, |: w% l6 F7 A7 i3 C- B  B
        exit 1$ Q* k; b# J# d0 p+ ?  i" ^
fi
* X  w, s9 J& ^2 ^( Yfi  m# U( k3 L  W/ W5 T$ ^- x  E
#############################################0 J, w4 P* @) b, f* t
( r9 P. v. Q& I; Q) B' }
; D1 T# ]; e- Z; ^) o& G% w+ Y. v# {, H
2 S; u- w! r( G
2.提交完毕邮件通知$ o/ \3 }' }# D- F( c+ i5 Q5 ^" A
http://bbs.scmlife.com/thread-14543-1-1.html3 K, r# u; d# X" {& L2 k8 o% y" d
见此帖子: z: x. N# Q, |: H- o- B
3.增量备份
5 {  @5 P( k- I6 `
8 N, O  j9 l, `- q2 w8 S- i( U9 q# R* d! \' T. R8 [6 i0 @5 n4 j
4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件
) F" z" C4 S7 i4 v) Wpre-commit: O9 |# E2 c# }* r( L3 u
###############################! N% C( `/ M: l" Y: Y! \9 I
REPOS="$1"- \  g8 w: X8 q9 V. q' F
TXN="$2"
$ n! j4 R1 r+ m; O. i7 vRES="OK"5 [: g5 i9 ?* ?8 B" W9 }
st="k2/branch/BR-K2-1_0_001_20100316/"
2 M  ?& d; s# j7 G( F1 x, tABSUSER=$($SVNLOOK author $REPOS -t $TXN)9 ~; y- [0 w* |6 C& D
if [ $ABSUSER != "ads" ]3 f0 r! T- O8 H
then; V3 y* {6 h0 k* V7 T
        if [ "`echo $files|grep $st`" =   "$files" ]5 F1 x. a( S/ T% u
        then/ J' }" y: `. X& l% i# c" H! A/ [9 \
                echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2+ }# R3 ]$ @& Y
                exit 14 F0 c5 Y# _" Y
        fi: o5 _' I' Y" ]" p
fi" O. V: }3 a( q) V) c" ?, T4 C. d

) _7 T0 j' X' _4 ~exit 0
5 g  Y, o% b! {* @+ V1 R$ e2 S! P, e8 X! ?4 U" |
###############################
/ o! \! v! V/ X* G" l0 y自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。) M; I+ m% @6 X1 r/ l
2 Y; H1 O$ I% |! I8 a; ]( D
5.钩子脚本 对锁的管理8 j% N: v7 S  Z" l7 U
http://bbs.scmlife.com/viewthrea ... highlight=%2Bgo2cxg9 m( B9 D3 a, {/ f9 ]
见这个帖子 有详细的说明。
- c6 d# Z0 B, T; e" K5 `" c$ M: A& c" B3 [
6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)  E8 Q4 h" s7 K# G3 I* H0 j
pre-commit* e  j' ^$ ^( u
########################################7 _4 C/ `* `# ]
REPOS="$1"
. U( S7 S! P9 K, ]+ `" r$ y; ETXN="$2". p6 p+ ^, @' p, B4 X+ j& s0 g8 }
RES="OK"; J# \( j9 ]$ }  R& B  T
MAX_SIZE=10240000  l# w) g, ^% ^% @4 O4 N5 }( _
files=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')( h) R$ c' `. F% S. `1 x/ O& r
for f in $files# L0 [, S5 q' `9 }1 G( F
do3 E; g8 j' C2 [. {
filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)- h, _. ?0 R) r4 {7 ?  d
if [ $filesize -gt $MAX_SIZE ] ; then
$ M' @% E" [1 a/ C* W3 pecho "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr4 k1 k1 k: y5 h" V$ P8 E
exit 1
+ `# ^$ [! b+ d1 Q3 Q& G9 yfi0 Q5 `) `2 E7 y( s& e% @$ i6 D
done9 s, t; }" ~( v& x0 L; Q
########################################2 j. n- W. ^, _% R9 g8 M8 O1 u
当然 这里还可以做一些其他的限制' d. ?" I( l, D  ~# h
比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制5 ?" Z, d5 q! p* D

, a- p$ C$ {' @2 j1 w) S+ f[ 本帖最后由 go2cxg 于 2010-7-2 17:24 编辑 ]

本帖被以下淘专辑推荐:

  • · SVN|主题: 9, 订阅: 1
  • · SVN使用|主题: 1, 订阅: 1
发表于 2010-7-16 15:24:51 | 显示全部楼层
感谢楼主分享0 y% y' s  \7 c, Z% B( B
学习一下5 F4 f4 ?2 U' y7 x
svn才刚入门呢。
回复 支持 1 反对 0

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2010-6-30 17:23:26 | 显示全部楼层
帖子比较长6 I+ @9 i7 C" l$ }
整理的时间较长 大家耐心看!/ X/ q3 D% Q) F6 I( ?) N, k: C9 g
有需求 尽管跟帖( R/ o  g( @8 u0 ^
不需再另起贴~
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-7-2 01:26:57 | 显示全部楼层
果然很长很强大!7 O. E: b4 u& A" B2 s& e+ h

; E. _+ b  b  l% c强烈推荐所有使用Subversion作为配置管理工具的朋友都要好好学习下此帖子,可将Hooks一网打尽,从而实现个性化定制需求,进阶SCM。。。2 ?) ^* F5 Q- ?: E

, N4 e; k3 ^  W$ @# u+ G3 n感谢小光分享经验心得!!
回复 支持 反对

使用道具 举报

发表于 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-6-22 09:49 , Processed in 0.090494 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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