SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 44808|回复: 92

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

  [复制链接]
发表于 2010-6-30 16:43:00 | 显示全部楼层 |阅读模式
钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!
& ?! g: x  ]/ @7 @! Y  ^" Q$ E& s下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。- X% C. Y0 Z* M& v, J$ T
欢迎大家跟帖~如果有新的hooks需求,请跟帖。大家一起来完成!, n/ {/ _/ @: W
有个前提,我觉得作为一个合格的SCM,还是有必要学点Shell或bat的写法。
7 k! T1 k' r  e7 V# m9 R$ k所以对于看不明白钩子的同学,可以先学下Shell的基础知识。
  }1 |) ?9 Q& Y不然只是一个理论上的SCM。
+ j( a; M' `' T谢谢大家!5 m9 m' m; {8 P6 ]* w9 R
一.服务器后台管理命令
( z* N( @- V9 C- M9 f, K8 a1.svnlook! m* z& a5 B: E$ w( R
1)svnlook author 4 t1 v+ C+ k. e, I. J' l  B1 E
可跟选项
. k4 M2 i/ m" f* l. O" ?--revision (-r)
7 v. b& t( N) B0 ]/ ^9 f--transaction (-t)8 G- V  K# A* L# w7 @. I( J
打印版本库一个修订版本或者事物的作者。0 y$ I. `1 q% i# n
svnlook author -r 40 /usr/local/svn/repos6 Q" A; o2 b4 V/ ^7 H( \& [

' U4 U+ ^2 w" W; F7 m+ a& W9 u, m( T+ g0 n$ J: y' m# J
2)svnlook cat
5 u+ p' o2 [7 ^/ U8 o打印一个文件的内容
8 s, ~2 c3 Q3 rsvnlook cat REPOS_PATH PATH_IN_REPOS
5 W, l( ]4 O7 l. G5 I可跟选项, H. U" g* `) ?. i" N
--revision (-r), L. w3 `: p/ T1 D& v
--transaction (-t)/ I9 `1 X) e8 y/ u! R
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README
" D  N& N' T& f+ c2 ]. k- \0 h8 Gsvnlook cat -r 40 /usr/local/svn/repos /trunk/README
" F9 V4 n5 t, [$ s; w- y+ g% t
2 ?7 [4 M/ w8 E8 R* y3)svnlook changed
. k- y* L/ D1 s0 n% j9 ]( C5 t打印修改的路径。2 g3 z& ]5 _( W" X* {. Q
svnlook changed REPOS_PATH --最后一次修改1 e6 K8 {$ S  j; Q" a' P, h5 q
svn update样式的”状态字符:* B2 R! g* O( h9 ?7 C
'A '----条目添加到版本库。
$ y0 H7 J* K" L1 ~9 l'D '----条目从版本库删除。
! L6 ^( {' I& N3 R+ ?'U '----文件内容改变了。, l, R) Z, V$ n6 V! r
'_U'----条目属性改变了。
$ k" t+ U5 k& @' S8 F'UU'----文件内容和属性修改了。2 [+ {8 r1 g  J5 B# w/ S5 C
文件和目录可以区分,目录路径后面会显示字符'/'。
! \& z! |7 T- l; U5 ]7 a- g' @) }可跟选项; Z- Q' t0 }* i; \
--revision (-r), @) ]  s9 F! R3 t3 ~! N8 |0 h
--transaction (-t)
" o2 ^  ]% o  esvnlook changed -r 39 /usr/local/svn/repos6 _' I) t) _4 U+ C
; }6 ]- `4 |$ Z7 ^4 `, U# C4 C
4)svnlook date& e. a, Z. |, i

6 \9 ?7 d% u, b2 n0 ?( ^( e. z$ svnlook date -r 40 /tmp/repos/3 D1 J, P: J8 D4 E7 @$ N' Y. s" R
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)* O2 O) H+ f( g- N, ~
' }1 Z3 O/ `& L! \" x1 F* R0 d
5)svnlook diff9 `* X* w  L6 o- ^8 I" m
svnlook diff REPOS_PATH$ `0 y- c* Z7 }8 g# f! T
可跟选项
. J. M4 c/ t3 E--revision (-r)
* S' r, {3 r" m: J--transaction (-t)5 s0 P& V# _) }6 x* ]
--no-diff-added0 A: w4 R' a3 |0 J  u" x$ k
--no-diff-deleted( |( ?  ^' R( B
$svnlook diff -r 40 /usr/local/svn/repos/2 N5 R+ e2 e5 J" x( i% p4 }2 j# T
Copied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt): _! p. H% H2 R! o& r2 X. X

; p  E3 k& @0 d0 R+ g* EAdded: trunk/vendors/deli/soda.txt. \3 ^) u$ i9 @6 m+ S$ J2 k/ r
==============================================================================
  m# w7 }% R4 _. o& M$ z9 p. L! H0 @
' W; E5 Y( y# y; G; \3 lModified: trunk/vendors/deli/sandwich.txt6 v9 `+ h# q5 ~
==============================================================================2 n$ @* X) c' J+ p! R  S/ f
--- trunk/vendors/deli/sandwich.txt (original)
. Z( Y; o" J8 I2 A: ?+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -0600
) {' y1 f$ w" \- P6 h. q% O) M4 Q@@ -0,0 +1 @@
9 p9 n: a' `; X+ \+Don't forget the mayo!
, B% \6 c* I# `# ]4 J& p4 C9 S/ `9 |. ~7 G$ q
Modified: trunk/vendors/deli/logo.jpg
4 Y) Y, n; ~3 [, b  r# ]! V==============================================================================
6 M6 r3 G2 O% [/ ^- k0 f(Binary files differ)0 [7 q  j* S! Y$ }, h- i. W

( I% v) |# ~0 @Deleted: trunk/vendors/deli/chips.txt
! i% F  O% q0 ]! D# y==============================================================================
3 H. D/ l3 Z) V: m5 N" j/ A
9 X$ y9 P; E; r" \5 B1 LDeleted: trunk/vendors/deli/pickle.txt
: \& Z/ f6 i# _( A2 Z/ r# V==============================================================================  ~7 H3 Z) f3 [1 g
如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。 7 f3 G1 r4 {- |
8 \0 Z( ~; L* f5 J
6)svnlook dirs-changed
9 l) e+ R5 Y" U" p打印本身修改的目录% A) b+ L! E4 p$ Q0 y9 ^$ _; U
svnlook dirs-changed REPOS_PATH! i- ]/ {' o8 c- P, q
可跟选项
: l7 L0 U5 M3 y% V5 w1 h--revision (-r)9 o. Z" D* [" T5 V$ |8 @; ]  u
--transaction (-t)- E: p' b: D8 G" p8 B
$svnlook dirs-changed -r 40 /usr/local/svn/repos
4 U4 d4 {3 J* F5 Xtrunk/vendors/deli/$ x6 ]* L" J& r6 L, O# p; ^6 u5 D, k
2 X1 t# J6 a: {% F2 f
7)svnlook history 9 x8 E6 g. f) R7 L" E
打印版本库(如果没有路径,则是根目录)某一个路径的历史。- [. Z% P$ j7 b5 W$ `
可跟选项" c% w* i  N/ H. N# [
--revision (-r)
, Y# O. K7 r% R3 c5 {6 t--show-ids
& d; \, E& N8 G4 y. i$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids# F% [# U+ k& N2 s9 G, v/ t
REVISION    PATH <ID>8 r9 i, N  j- V, T0 {  y& R$ e
--------    ---------' G- o' v5 }% y. o' Y- S: u2 o0 t
       19    /tags/1.0 <1.2.12>
% v) J$ a, |- x0 z! T. ]       17    /branches/1.0-rc2 <1.1.10>
$ K& Y# e1 T1 k4 |" v/ ]+ C       16    /branches/1.0-rc2 <1.1.x>
7 H0 R4 W! @5 l- `       14    /trunk <1.0.q>$ c0 [& f) R% i% x9 j. Y9 K6 t% v
       13    /trunk <1.0.o>5 A' K* U6 a$ F* Q' @9 M
       11    /trunk <1.0.k>6 j" D& l6 B+ v4 g% }' a
        9    /trunk <1.0.g>* {7 m, v" d# Q* l" h7 v
        8    /trunk <1.0.e>
7 M) E1 h/ ], }6 Z$ I/ c# s        7    /trunk <1.0.b>+ l4 V. L) i& S# d. }/ s! |" j
        6    /trunk <1.0.9>4 b( W( v7 U  p3 v
        5    /trunk <1.0.7>& {% V9 b: R- m
        4    /trunk <1.0.6>8 L4 [: a+ @/ u  N4 A
        2    /trunk <1.0.3>
7 S6 ~; _( q0 q" V3 D  \        1    /trunk <1.0.2>& W9 s, m8 J$ s- @, s' x
8)svnlook info ! k( V$ Y! J7 l* c3 O* ^2 E
打印作者、时间戳、日志信息大小和日志信息。 * |/ J0 u% O1 n5 \2 z
svnlook info REPOS_PATH
3 a! m! ]7 x- b5 q可跟选项
  p' A0 ?- x- m* q' [--revision (-r)
0 a3 K8 W2 h0 n5 [% _+ J' B/ F: ~--transaction (-t)6 w3 _( L1 |6 M. k2 l
$ svnlook info -r 40 /usr/local/svn/repos
# c/ Y$ S2 }0 ?+ e) v/ Bsally
/ d+ n" N+ b7 d& ~) O' d2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)1 x8 C# y8 r8 n6 x4 x
15" ?, L/ d5 i1 o% K$ Y0 {" ^
Rearrange lunch.
- V. U- p" d% b3 F/ p% i: i+ v5 d2 u
9)svnlook lock. f- F# S, m4 v  D9 r4 ]
打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。
* y- T- \! n0 b- T7 o这描述了文件tree.jpg的锁定。5 T& B/ O# P' ~  @8 [
; D" Y7 p' v/ L* x7 e
$ svnlook lock /svn/repos /trunk/tree.jpg3 l: {1 _- U7 z1 ]6 }9 w
UUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda813329753
5 G& \9 X1 R, j* U1 IOwner: harry% X( Z# w2 A. @7 I  N
Created: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)/ H6 a7 W  ?# \/ d' k
Expires:
1 S6 A4 _; K' |! i8 gComment (1 line):% m! F6 k, a. q8 Z0 G2 Y# a9 {2 t( Q
Rework the uppermost branches on the bald cypress in the foreground.
" A) Y$ K  T6 c' D" x( q, ~/ c3 E" _! s5 t5 ^! i
10)svnlook log 0 J5 A+ c8 B& ~) e* X
打印日志信息。
8 `- O$ f3 r3 }2 [) y* S" Isvnlook log REPOS_PATH
+ D  s. L) ^# c" t* y/ W7 l2 ]--revision (-r)
" y: i2 c3 z; i. R, A--transaction (-t)4 p# [- b( x. I" l
8 S9 O6 \* F9 Y$ \; U) k# G# c
例子
/ B$ k2 A/ G$ ^2 M8 N
; Z4 v$ D+ ?* [# Y( L" N这显示了实例版本库在修订版本40的日志输出:
2 m1 s+ z& P9 T
% ~# j0 x, U1 \2 t" D8 V可跟选项
$ e, t  F7 e2 E) A; [--revision (-r): x6 ?9 S0 ~1 s% M, T  H
--transaction (-t)  W5 N$ w. s' |

# E( n5 e/ E" F3 j7 q5 p$ svnlook log /tmp/repos/) x4 m# Z6 `% D2 B7 Y5 u- y) D
Rearrange lunch.
/ y2 A: v' c: j, j. ~3 H4 U* _5 O4 t$ z2 {( _
11)svnlook tree. M( x1 H: ?- ]& X/ x! [
打印树。
( D+ X+ }9 E  X5 M8 A9 wsvnlook tree REPOS_PATH [PATH_IN_REPOS]# @* M2 v1 Y% F+ X4 \  r$ G
打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。 4 l8 x. q- y+ Y+ D3 s) n

% ?% D) S! k5 l3 A" d% y0 z: D* k- Q可跟选项; u9 S! z, @; f+ C" q. N
--revision (-r)$ Q. w7 `- X, T, g' G
--transaction (-t)
) F+ }8 J$ B$ C) z! s--show-ids% G; k! ]3 o8 y4 u  f' Q. ?3 [
& [9 J3 @% m+ }8 F4 w  ^. ]
12)svnlook youngest0 V' k: g" {1 j
打印最年轻的修订版本号。
& M$ z" l: C" W4 K这显示了在实例版本库显示最年轻的修订版本:, f; j$ p8 b  V) j
; @' O8 n7 q; o. f
          : k1 X7 {& o1 Z: Y4 @  V5 [
$ svnlook youngest /tmp/repos/ 0 t  I  `: C0 l1 v
42" e1 k0 g/ \/ e' d( [4 m& V5 x
- [; n: ?8 l+ |/ ^+ y- G% @
2.svnadmin
( x2 m! z4 ^# `' R1)svnadmin hotcopy — 制作一个版本库的热备份。& x5 {. ?! T  C7 [/ Y. N
svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH
0 U" Z0 @9 b- J
5 @3 M* g, |8 z5 X( d; U2)svnadmin dump — 将文件系统的内容转储到标准输出。  W$ e% W  z. U) t
svnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。4 R6 ]$ L. U/ o* K4 M% n1 m& c
这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。. M  c7 {/ p- z
然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,
9 b+ E# Q- s& m7 |也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。# R$ A; E8 ~- z! U' y
; S" Y8 M+ q7 i6 M- k2 ~6 ~
转储整个版本库:' ?# N- Y4 J& v. g1 M, t) O* u

5 B9 n3 u! B# c* c$ svnadmin dump /usr/local/svn/repos* x/ D( ~' ^+ P1 h
SVN-fs-dump-format-version: 11 e: Y' c* x( E) o, O5 C
Revision-number: 0$ ^- A# A7 u" K% }2 C4 {  q
* Dumped revision 0.
# g: h1 A2 {+ ]0 CProp-content-length: 56
4 Z; _0 H% }# ?+ X' l) f, QContent-length: 56
+ ]' y. y* W/ I9 }+ F! h, r1 A
# d& T+ [/ [2 v
; W  E. Y* [2 P% J* _从版本库增量转储一个单独的事务:8 S; C7 l+ g6 \

% Z0 x0 o! m1 x3 d' C0 e$ svnadmin dump /usr/local/svn/repos -r 21 --incremental & R: E& r* D# Z: s
* Dumped revision 21.5 d% b" I# {- d# Q9 `3 r/ U' Z/ v
SVN-fs-dump-format-version: 1; `7 ]+ T( {5 {8 Q
Revision-number: 21
9 D3 H+ k, ]! ~8 e9 X# c3 MProp-content-length: 101+ |) Q0 c. V* b% F% i
Content-length: 101
1 L, q4 x7 ~' }) O3 |1 {1 l" I' P4 }+ q1 \& k6 c1 [

: e5 x5 W4 |/ s$ p* Z/ G" {  z" s+ Z
二.hooks简介
6 s* q4 x  V& n# {' `+ o# ^
$ f  ]5 l6 [5 |4 P" G钩子脚本在每个repos的hooks目录下面。, Q. _% M  U. a! X4 E6 m6 s
每个里面都有模板,名字如下:  v  D& t. ^& G) v' ~
post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl3 |$ \4 L, }: X
post-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl
/ s8 [0 O) O4 s. c
' z8 z7 |! I' _9 J! R+ c* ?) f下面对每个钩子的功用 做一个说明!: A; D' Z  K# L$ i$ t, P

. `6 g/ @6 ^, M1 F# w  z- u7 x1)start-commit — 开始提交的通知
) e  h! W+ G5 @. U8 R& z描述
/ X' H& {7 {' }6 Z% }
4 Z0 H" s0 c. Nstart-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。
: v, u( Z! n& g! O" {% b# v
+ ~% v* A& |+ K: l如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。" {$ {" m$ T) Q$ c, O- ?3 I
输入参数4 `7 L/ S# K/ h3 @" F, b0 M

7 ~% M" ?% \* b( A. Z; y传递给你钩子程序的命令行参数,按照顺序是:* S% M1 O2 `# c4 j4 H7 I$ d
1.版本库路径5 u) s" V+ S5 b; L! [9 Y
2.认证过的尝试提交的用户名
2 ^, H# Q5 Y# |3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).$ q" ^3 w2 P* E! z6 @3 u

7 j( U9 _% Q6 }4 i, J2)pre-commit — 在提交结束之前提醒。
' u6 `# F) x7 s, l) `描述0 s, n& Q; V* H$ [" n2 T$ v# G
pre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。0 h2 W  e0 C$ F/ L4 V
如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。* z8 C/ T$ }. a. c

, ^' z: O1 _% V. K) L输入参数
( s" y9 O# ^# f( S& o, E6 E; s$ m$ z8 b) x  H8 k+ d
传递给你钩子程序的命令行参数,按照顺序是:6 j2 n& T  S- z, h* `  _  r$ N8 L2 o
1.版本库路径
! s5 X/ L5 i2 [2 X2.提交事务的名称/ [9 u- o2 o2 \3 v! j

. V8 Y/ _7 d% S$ z1 x/ f1 `( r; U3 g3)post-commit — 成功提交的通知。
. I7 N& l* q" i7 r, {描述4 t# H- h/ q0 n( `
+ w$ H' o5 W; U' C% i; U& m; q) I
post-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。
: ^) ^) V0 {! v$ \+ x; z如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。: A* f$ r6 Y9 @: w, o
输入参数
2 t& F" t5 Y8 N  [( f传递给你钩子程序的命令行参数,按照顺序是:" s) @$ j: v4 c0 z: [2 W* Y
1.版本库路径# ]# ?; ?7 ~( }/ _$ {3 h
2.提交创建的修订版本号: d3 L6 w9 I" W( |
' U& g3 E/ r& E3 [0 J& G- _
4)pre-revprop-change — 修订版本属性修改的通知。
0 W7 l+ F2 O4 d6 X描述8 D) _* @" \) p& e6 z
pre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。# X2 T9 \$ x5 D
如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。
/ W& h$ M$ _/ ~% C6 Y输入参数
9 E8 D# x( y3 m# T6 W+ U传递给你钩子程序的命令行参数,按照顺序是:1 H% K$ y3 K4 M$ O+ V
1.版本库路径
. @. C1 h. z( E, ?2.要修改属性的修订版本5 Y$ }, G- K. o7 i. H0 F
3.企图修改属性的认证用户名; }: O  C' ~5 T: p# Y, {6 X
4.属性名称已修改
8 h* T* H( ?% N8 ^; v1 ]' A( i5.变更描述:A (添加的),D (删除的)或M (修改的)
$ ~! Z  ?, b9 g" G! Z! R: t+ L( {( Z" S
此外,Subversion 通过标准输入将属性的新值传递给钩子程序。/ o" H3 s7 n0 l( l7 n# M$ ]" i

. [4 z$ M1 K( F7 [5)post-revprop-change — 修订版本属性修改成功的通知
7 A+ E# s" E( ypost-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
6 m! i& ^+ n# H5 k; E# @/ Y如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
; q: x3 M& P* X% U输入参数: j+ P" f5 l! ?9 V
传递给你钩子程序的命令行参数,按照顺序是:
7 {! b" D( C8 [5 K- _, ~) m9 x. ^& r) {4 d2 w3 q7 G
1.版本库路径
& o; [' h8 r4 P. R7 G" p2.经修改属性的修订版本. X* ^) O: {5 s" k+ N8 H6 p8 N: ?
3.做出修改的认证用户名0 p, \* D9 [' _9 X& W  \1 `
4.属性名称已修改
& I+ g9 [1 B* P/ l* u6 p4 D9 j5.变更描述:A (添加的),D (删除的)或M (修改的)! o9 ?/ K* j% r. y, R; U5 W# u" ?
$ Z5 ^4 ?7 f) P7 P; ]6 D0 B
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。% S. k$ ]$ D' @' z, a, Q4 a1 {& t
1 d/ `6 Y1 j5 \; r1 f# O3 z
6)post-revprop-change — 修订版本属性修改成功的通知: Y! n$ ]2 Q; D- ?
描述& J# D& X6 K, v$ S/ L% k, p% L
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
. Y! _5 o. q+ f  j如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。( J. r6 ^& D; S$ q/ ?
输入参数1 @4 M& X* j: w- X/ w% T! N9 @4 |

; a$ `% _. z' |传递给你钩子程序的命令行参数,按照顺序是:
4 ~) O% |4 _& x# ^   1.版本库路径
) N1 `( f+ P6 A7 l   2.已经修改属性的修订版本
- O5 o( [. T& P! X" \8 d   3.做出修改的认证用户名, h2 A. M+ R3 M7 i! h
   4.属性名称已修改
1 c; ~5 f. u6 ?4 N* ?6 i8 Y+ O   5.变更描述:A (添加的),D (删除的)或M (修改的)
& d4 ?" }% h; u& |% j2 O此外,Subversion 通过标准输入将属性的前一个值传递给钩子。
" H) |0 _8 p8 A/ I& |; i
, z1 s; r6 g- G% k$ V- E- D  ~7)post-lock — 成功锁定路径的通知。
/ c. k+ _  `8 l* l! U, j" Z描述$ U: w2 E" X4 ^( G: W
post-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。
4 s0 [) k8 f+ e如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
0 u8 ]! T+ Y" C; I% `输入参数! ]6 _0 \2 D* d3 s$ }3 X
传递给你钩子程序的命令行参数,按照顺序是:, t  X1 e5 n3 k0 V
1.版本库路径
$ n1 \8 h( j- L4 h( M5 n) M2.锁定路径的认证用户名$ Y( S8 @( n0 G8 k
/ F7 D  r  n$ B# S8 `
此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。
- Z3 Z$ R; i. h# m1 Y& G1 K; t9 g9 j, x
8)pre-unlock — 路径解锁尝试的通知。9 |% S, t' j! C5 k: |' T9 f
描述7 B& @1 `4 b, P; o7 ~( \* d- g
pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。$ {" c" m1 n; Q7 t! o) U
如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。+ {* l, ^! @/ l: ^: n
输入参数. O. d, ^; {4 I; r2 D
/ u) S& e/ y5 y/ p$ B
传递给你钩子程序的命令行参数,按照顺序是:
! H# S- R, v+ R% X" I: j# u7 h  K: ]; V6 l# s: S8 c- a9 X
   1.版本库路径, D6 k; V/ i5 P( Z
   2.Versioned path which is to be unlocked
% r  k+ a4 D  ~4 h8 `6 N2 |   3.Authenticated username of the person attempting the unlock8 m9 i% l/ H+ `$ P1 }7 S
6 x# I$ \+ m( \# b+ ]9 F
9)post-unlock — 路径成功解锁的通知。) f' h. O; p+ O# N# d5 ^/ j! P
描述, K* _6 Y6 c0 y5 }, F& U3 i
post-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。. E  c4 q9 H& l" r2 H! @3 {5 ~
如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
* j! p4 v+ ~# W输入参数
" p# G2 V4 ^- c传递给你钩子程序的命令行参数,按照顺序是:+ }3 T% Q1 Q, k" C2 Q8 x
1.版本库路径
% p3 x& G  {& F+ H2 n' n$ c2.路径解锁的认证用户名" _9 g: ~: Z  E9 m
9 B, g" R$ }, k& x* d8 W
此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。- i3 |4 m- u; z+ ~
1 }0 A' x) G! h

4 I% |" R5 \$ m三.hooks本应用demo. V9 V# W+ [) W- {1 e8 \" u
就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。
7 N& c% C: Z/ H- k% f+ [* o
& _; k2 k- f5 W. J3 R1.如果不想开发人员有删除权限,只有SCM用户有删除权限...
) j& d7 m/ z! J# [! d! q# Z6 Q9 \3 e( L/ _6 L% @, K* _: j
#############################################
8 O# ^# W! }7 {9 j$ g+ [2 l5 D5 ZREPOS="$1"
" r2 k# t( |2 U8 M' ~4 aTXN="$2"
; g* ]- z4 K7 URES="OK"
( Y2 q2 s1 L& `+ J#USER="$3"
3 d. S4 F- j3 ]/ q, m# mSorry~没有这个变量 呵呵 9 X# L! ~' z  U, R
USER可以这么获取; z. Q/ Y0 ^- Q! V& c% c/ _
USER=`svnlook author -t $TXN $REPOS`3 C# w2 h' {: b  S- ^* R/ {
SCMLIST="user1,user2,user3" #scm人员列表
; G3 r& B. F5 P$ |
; K/ F& M. Q% Q7 b1 eif [ `echo $SCMLIST|grep -w  $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断- \" {5 V% b; E& a0 t
then  i; V  P1 S" Q) x% n! t4 o4 E3 W
SVNLOOK=/usr/bin/svnlook
6 L/ Z3 @+ f; Z) R, {& rLOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
* `* `% H* ?, Y* U% q1 SLOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
5 Y7 z3 Z- z& i
0 J- v) W, _' ?* J' D5 o$ Iif [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]( f9 p3 I/ G+ u9 m6 K( b: S( A" m; ~
        then& t$ j8 @# ?' k* g+ Y" |
        echo -e "\n You Don't have the pemmision of delete  " 1>&2
; v# e' B# U( ?        exit 1
3 a2 m# B/ b! ?1 Ofi
' X5 R+ D- j  k3 q5 Q* A( Xfi: q' ]7 J1 m  H; O5 T! J2 a
#############################################
. y5 v  a) }) f- m0 `* V2 I' y, ]' r6 k( L

  T0 o8 R! X! ~1 `, s
! h1 L  E% _/ i! ^2 w' {2.提交完毕邮件通知+ R9 J/ c2 s' u; S) d4 Y( W  [
http://bbs.scmlife.com/thread-14543-1-1.html
$ R- {3 V/ z  l7 c0 y7 f4 ?见此帖子8 T: _6 k, q: p/ C, [: {
3.增量备份9 E- a/ C. Q# w# S$ ]

4 {/ {) b5 \1 N1 K$ C
$ q9 v' _" X! z" M# X4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件
) v. M: m! ~! [/ S: y& apre-commit8 O  Z% ]$ y5 ^+ Q+ [
###############################. e/ |& B: \9 h
REPOS="$1". o: a5 y; D% H4 M; ]
TXN="$2"1 D! Z, y& R, g
RES="OK"
$ @. d) r$ w1 G6 }2 B# @st="k2/branch/BR-K2-1_0_001_20100316/"
4 B" x/ I# c% m! R7 j( c2 X+ M' qABSUSER=$($SVNLOOK author $REPOS -t $TXN)
6 _6 i9 o2 Z2 Z; sif [ $ABSUSER != "ads" ]" f3 x( u+ V$ U. k; m
then" v- \6 {. s$ v/ z  y: Q
        if [ "`echo $files|grep $st`" =   "$files" ]: M) w) U! ]$ G1 k
        then
' y8 Q; h- f8 h  ^0 S8 K' t                echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2
4 d+ `8 ?3 c1 H: B                exit 1% W" F3 Y0 J! v9 U: W% U
        fi
, J# S" v6 m$ R4 Y/ g4 Yfi
8 H- R! F2 M& s* E0 a8 b
* b. q/ ^! a, i9 Z5 ~- [8 mexit 0& `. ]) Q( T0 R1 M1 N
6 v* [2 K/ Y6 F* i( s! K" m
###############################" \% N& y1 U4 m: V
自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。
0 d* P; ~5 _# e& V
( s' P8 u1 J0 x: u# ]( ]5.钩子脚本 对锁的管理
( P( M0 x9 a- `: Z+ }' Mhttp://bbs.scmlife.com/viewthrea ... highlight=%2Bgo2cxg
9 ~6 l" T& ]' C/ m+ I见这个帖子 有详细的说明。9 p8 M* v6 Z3 |' d5 O2 \7 s

1 v3 m; H0 T5 j: c3 p- z6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)( l) ^# E! B9 Z1 e$ F* Z5 U/ s' S
pre-commit$ A3 ?, {( @# U' i0 b4 }( r
######################################### @: ^3 w5 W' w0 I, T4 f! C
REPOS="$1"
" G) g: y, n5 S: L- `3 C( VTXN="$2". }8 G" l6 ?( p; W3 E
RES="OK"# s) a* S, d: N
MAX_SIZE=102400008 v+ x; ~: v! j4 v- ^& F! n
files=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')- E; w  [& b5 V/ [+ ]8 R' J
for f in $files
  a; ^+ U  {( I) Fdo
. Q/ Z/ ]* B/ Q5 \* D, q- mfilesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)
9 ?) u. Q6 D  D0 \if [ $filesize -gt $MAX_SIZE ] ; then% D4 t: R* L- b
echo "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr) e4 r9 ?: a& q
exit 1
/ a, t/ |9 k6 N; s2 Afi
1 {" b3 k3 `& L6 k3 ^5 m6 Adone
! d8 r( l8 W% [8 f########################################, f9 s6 _5 s7 I$ u& \
当然 这里还可以做一些其他的限制
, s% v) t. t9 Q. L6 c) H! @比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制7 _1 n  Z( e; {( }' ?$ ^3 R

  r4 A: s7 e. m0 T3 z  q# d  j; X[ 本帖最后由 go2cxg 于 2010-7-2 17:24 编辑 ]

本帖被以下淘专辑推荐:

  • · SVN|主题: 9, 订阅: 1
  • · SVN使用|主题: 1, 订阅: 1
发表于 2010-7-16 15:24:51 | 显示全部楼层
感谢楼主分享0 W7 Q! h+ \* e4 c1 n
学习一下3 L, f- v4 B2 g
svn才刚入门呢。
回复 支持 1 反对 0

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2010-6-30 17:23:26 | 显示全部楼层
帖子比较长. B4 S# |8 d" \' Q& i( ^, b& |
整理的时间较长 大家耐心看!
3 a" h4 P3 o7 n有需求 尽管跟帖
7 {8 ^' P0 k! L不需再另起贴~
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-7-2 01:26:57 | 显示全部楼层
果然很长很强大!3 j( H! ~. D% A/ Q4 z: j. t, u7 V

* I) Q( Q: W0 n) L7 r6 m# ^7 X强烈推荐所有使用Subversion作为配置管理工具的朋友都要好好学习下此帖子,可将Hooks一网打尽,从而实现个性化定制需求,进阶SCM。。。
2 A: r8 z+ L: W, Q
6 q: v( T& O# F, K* J感谢小光分享经验心得!!
回复 支持 反对

使用道具 举报

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

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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