SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 46320|回复: 92

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

  [复制链接]
发表于 2010-6-30 16:43:00 | 显示全部楼层 |阅读模式
钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!6 V% D5 z3 p  V' z5 h1 r
下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。  x* S& B2 i7 D# c: `, R( \& }
欢迎大家跟帖~如果有新的hooks需求,请跟帖。大家一起来完成!
3 k+ z2 L" Y8 K有个前提,我觉得作为一个合格的SCM,还是有必要学点Shell或bat的写法。
, _7 U5 s' d+ z所以对于看不明白钩子的同学,可以先学下Shell的基础知识。& H4 D& S( Z6 W0 ~" }5 ~
不然只是一个理论上的SCM。
0 P7 I7 ~$ Z- A6 n: _4 \谢谢大家!# f5 z* W8 {) w
一.服务器后台管理命令  Z4 d. Z; I' n: j& X+ {; {0 z
1.svnlook; J2 m: J, E2 C  V
1)svnlook author 1 R' o- Z( i, T8 s4 Q
可跟选项
, @$ I) R" x* o; L: p- K--revision (-r)+ B/ h- Z$ M3 e7 @, f* a" n
--transaction (-t)
1 M5 {/ |9 H. [9 x5 V打印版本库一个修订版本或者事物的作者。
; P- Y; X& w" Z6 i, n0 |, zsvnlook author -r 40 /usr/local/svn/repos
9 E! q4 `- J+ Z* P+ L
, o7 f. r4 m/ d' y$ ~% d. J- @6 T2 z5 J5 q# T
2)svnlook cat ; T) ^9 G' z; I" r
打印一个文件的内容
* U7 V" O0 m/ h9 j3 h+ Ksvnlook cat REPOS_PATH PATH_IN_REPOS
! A0 Q- O' n5 S: a. V9 i9 c* z4 ~可跟选项
% |6 \. a4 z$ X( u--revision (-r)  H$ [+ ?/ F  G9 r3 ]4 ^6 U
--transaction (-t)3 N6 R$ o- c' p' F  U
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README9 A  C. G# f& y' d2 ?
svnlook cat -r 40 /usr/local/svn/repos /trunk/README
$ F4 E( g, A: t# k2 j5 ]# l+ |5 B( y7 N, e4 m, s8 W. X1 k
3)svnlook changed4 E+ V  ]* ]+ l& I( F' W- x
打印修改的路径。  k& S/ g2 }8 k5 l2 y/ B4 R
svnlook changed REPOS_PATH --最后一次修改
$ u( y* a) f  v1 _/ Esvn update样式的”状态字符:. |4 ^/ s: h9 x/ e1 ]/ j  b: |  ?
'A '----条目添加到版本库。
: N' j0 I/ |! }. c7 ^3 \& Y'D '----条目从版本库删除。
% }) x' `. z6 a- E; a'U '----文件内容改变了。; k6 e% K) \# U
'_U'----条目属性改变了。
) U8 Y9 V' c6 \/ v/ |'UU'----文件内容和属性修改了。
" U( t* E3 I8 L! P文件和目录可以区分,目录路径后面会显示字符'/'。
. t8 q- c  ^; x, t可跟选项
6 e8 C' k. a) I& P. Z--revision (-r)% v5 m4 T/ n) U; i9 E$ g
--transaction (-t)
& I8 u8 v8 `& ]' A3 ]6 h* fsvnlook changed -r 39 /usr/local/svn/repos
6 H" A9 i% s7 A* K% z) g! y$ |( l7 B3 u% b# [8 u- c( s4 p
4)svnlook date) d6 M$ T' P% e6 ]6 F
8 T- l/ |8 K3 ]4 {/ l
$ svnlook date -r 40 /tmp/repos/" Z2 C+ b! J; D
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003); Q' Y; D: m" X' s
1 N0 _( i3 P% F+ H) @
5)svnlook diff
+ ?7 k/ m7 Z6 O  P, d, M/ Vsvnlook diff REPOS_PATH
7 u; {% P* n; z( u- M$ ~7 I可跟选项
  c3 M1 o' S, k' }8 h3 v' M6 {% X--revision (-r)
5 U7 y( K; [% ]+ _* a--transaction (-t)7 k8 f  n7 k! j$ l( P+ U
--no-diff-added
( V% k! _  n' Y+ a3 _--no-diff-deleted
3 u+ ?( [- m3 s$svnlook diff -r 40 /usr/local/svn/repos/
, n/ r- a/ ?- x- {$ b2 DCopied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)
( W2 x' n5 b( z. I) g, z' M9 F8 V! L8 k& j( r/ L& Z3 B0 v
Added: trunk/vendors/deli/soda.txt9 V2 c$ B0 n7 ^; N' y  n. o: g, U7 @
==============================================================================
5 |- ^' T- }# G) A7 k% @4 o* {7 u0 G: N3 ^: p. S5 ]- E
Modified: trunk/vendors/deli/sandwich.txt- L1 g6 F9 Q3 }6 X
==============================================================================
, ~) ~1 K- _$ ?5 E9 s--- trunk/vendors/deli/sandwich.txt (original)9 V' m/ [7 D9 L- b3 U' x
+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -06009 l" z9 d+ t7 s/ @' }( z/ B
@@ -0,0 +1 @@% S" [! b! D2 V
+Don't forget the mayo!
! y: e6 p4 `0 @% n/ {& ^! t/ ~$ g* _- y6 D+ X  A' C
Modified: trunk/vendors/deli/logo.jpg9 M6 x. V" b8 k0 t
==============================================================================0 J, ?. G; I: H* r
(Binary files differ)4 l% s4 b* n6 {
) ~# M& V& y# a- E- E- w
Deleted: trunk/vendors/deli/chips.txt6 J2 Z9 e6 S& B5 s: z1 x
==============================================================================
* \( a/ p4 N. D% X* [0 k+ H: G4 Y5 e+ k3 v0 R, @2 f/ p- o# `* D5 G
Deleted: trunk/vendors/deli/pickle.txt
2 Z, h2 o3 n. t/ x2 U==============================================================================
% u' o& y( S! q! L如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。 ' Y: e' ]/ z4 P& W1 ^# `- W/ x3 _
, z+ ?* B% q4 g8 n' p8 `  j/ R
6)svnlook dirs-changed
% t2 ^) N0 N' E打印本身修改的目录3 p% A4 t6 X. y" b: s
svnlook dirs-changed REPOS_PATH
  j# T: N6 s6 v7 ^- P- N可跟选项
, f6 G+ o) l. u4 X, b& `9 J% ~--revision (-r)7 u* K8 m% m$ T2 K
--transaction (-t)6 B7 l+ I5 m( `  M
$svnlook dirs-changed -r 40 /usr/local/svn/repos6 k3 z2 m4 F# e! F
trunk/vendors/deli/( m( f% P+ v" H1 V: J
0 \$ H" m6 z0 A3 b
7)svnlook history
: e9 c( A  x- _5 ^! t9 h打印版本库(如果没有路径,则是根目录)某一个路径的历史。
- W7 ?% G% A% @可跟选项
" a5 B" z% C5 k; W/ z& l& h, o4 N) ^--revision (-r)
& S# E( u5 @4 g$ x--show-ids# l/ Y" S( x' ^0 w$ J1 t
$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids
9 w, e# u3 q" QREVISION    PATH <ID>0 i/ R3 _4 M" g
--------    ---------1 N# R2 S9 Q& i- L
       19    /tags/1.0 <1.2.12>6 `( X8 c1 O: Q, s  e) u* ~
       17    /branches/1.0-rc2 <1.1.10>+ |% W& w/ m9 g  S  N6 {: [: |
       16    /branches/1.0-rc2 <1.1.x>* F7 d( ]1 e' t9 q' F: p+ u9 B
       14    /trunk <1.0.q>
& ?/ n5 y4 H. h       13    /trunk <1.0.o>6 F* c! y3 v7 X* t/ n
       11    /trunk <1.0.k>
4 u* K3 Y5 u1 N7 G  s        9    /trunk <1.0.g>' n. D, t2 i. F1 ^4 S, c
        8    /trunk <1.0.e>! d% O; G9 g9 ?' ?
        7    /trunk <1.0.b>
+ L/ z/ N7 D1 I+ C6 K% L        6    /trunk <1.0.9>! f3 y# p) v( h6 H1 [' A
        5    /trunk <1.0.7>, ?1 J9 b" q0 b; Z) h
        4    /trunk <1.0.6>! u; Y, `" r1 S" U/ W
        2    /trunk <1.0.3>
$ t+ a3 a6 |( k$ x, N' e4 h1 B        1    /trunk <1.0.2>- w' e+ x& i4 f8 N4 f2 T  }/ M, ?  m
8)svnlook info
2 r- f, h/ h6 y. q. \; O打印作者、时间戳、日志信息大小和日志信息。 ' g, [8 a5 i% t& H! E" ~( }* E
svnlook info REPOS_PATH2 F$ t; I! U* o" X
可跟选项
+ w9 q9 d# t- n--revision (-r)% p8 P* g* X5 ?* O; B! A* h* p
--transaction (-t)9 a- I* c2 b: X1 @
$ svnlook info -r 40 /usr/local/svn/repos: Z- n+ G0 x/ _
sally
  U: I/ H) ~1 N3 _7 y8 E2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
2 L" D/ C6 L+ J15
4 c3 }; t6 M% u) a3 C4 yRearrange lunch.' N- M( C+ D. ~  A/ z+ V9 u

  z: p  v( V% ~0 c9)svnlook lock3 \  B/ g& p4 l5 M3 [) H
打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。
( L, o( u- c* b/ }! B/ j; w这描述了文件tree.jpg的锁定。% h1 e# g8 J' {( [- Y& D9 ?

" {' `$ P3 j$ @# g$ svnlook lock /svn/repos /trunk/tree.jpg
# Y1 w0 S; D* _$ D2 t  lUUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda813329753
' ^/ k# [& c. B: ^6 XOwner: harry
2 A, G( L+ s% wCreated: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)& r# Y0 ^; p- k* `9 K' V
Expires:
( S+ c- C9 T' j- I, V7 [9 N' YComment (1 line):; U2 ~( k5 o2 [
Rework the uppermost branches on the bald cypress in the foreground.
& }$ v5 r( ]2 I" l6 D: o# M1 Z  I" w9 n+ V
10)svnlook log & w* K, }7 K" F, k; g  w6 m
打印日志信息。2 f# K, R. x+ c, U/ a3 w
svnlook log REPOS_PATH2 I8 X& Q" n& m: D) T$ b
--revision (-r)5 u; z' E% k$ s- L( g$ e
--transaction (-t)+ ~+ I& ~4 F" J  b
( K2 V+ g- g0 P: O; ^% o
例子
" a6 i& ^7 e  X5 T
, X! P: c) U8 K) U$ G/ s4 ]: o$ R3 c这显示了实例版本库在修订版本40的日志输出:
2 k9 ^% e1 D7 M' p7 u+ V% i( s
( f/ O# N5 |! a' q可跟选项2 }8 f, J% ^" R& Y/ k9 b
--revision (-r)0 Y4 }; G. k: ?1 Z$ S5 _) _
--transaction (-t)0 I. |: J) Q, V7 P  y
; `, j) o; C4 W) e! H! @6 W
$ svnlook log /tmp/repos/# L: W) J& h+ I" J3 d( f2 p
Rearrange lunch.
; M/ [/ P$ O/ Y+ D/ e% Z/ e; }4 v5 O8 j2 s) Q
11)svnlook tree) o* [4 k) R* n, K  M) S
打印树。# i9 a; r% R0 z% @6 I
svnlook tree REPOS_PATH [PATH_IN_REPOS]; A8 ?7 ^4 n. p
打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。
7 r. o: l6 `; Y' _) ^6 w
( j- G1 M$ F7 ]- i) o- I$ M可跟选项+ T' M7 S4 D( a& A! I- `# Y7 g3 I- ^3 D
--revision (-r). b/ a" T, L: H% h
--transaction (-t)8 v/ ~2 ^, b6 |# l# ^1 z, v
--show-ids* Z- L. r- I8 A! s

( s% S% A/ ~. ^/ h# X+ p12)svnlook youngest
1 @: ], I0 r2 N) I; T打印最年轻的修订版本号。
+ a; v1 p* k$ m/ n: E4 [这显示了在实例版本库显示最年轻的修订版本:
# j% X8 N  Q0 N/ `- J2 A+ J! a5 l1 l+ Z3 b, B* b1 L
          6 u% [' t) K6 _: m% m' t5 R5 z' z
$ svnlook youngest /tmp/repos/
* B! }! w, f4 L# A2 @7 T! }426 o4 E  j6 b( K. j

( K. L- Z/ N" c6 t; Y; n2.svnadmin5 {# v. @, w2 L- }& h
1)svnadmin hotcopy — 制作一个版本库的热备份。
2 _/ e; W9 o- G- T+ m1 o( J' ]svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH" p/ k* m2 r. j4 J3 A+ k9 `" Q

# s" |3 V3 M$ i2)svnadmin dump — 将文件系统的内容转储到标准输出。
' _) b' T' C) ~' P7 U8 Isvnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。: T- }' x& K! F
这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。' J  ^0 Z. ~" m1 T  f4 x! K4 G
然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,& Q/ A! p$ z4 p7 D. f- \1 M, S
也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。
5 C. Y: D" ?, A$ z8 d0 e) H
4 r, P2 T8 U. P' J5 T. ^转储整个版本库:
( ?- M  W- `0 N0 t4 E; Y# ~3 c9 G1 x: N. w* @! B! b2 u
$ svnadmin dump /usr/local/svn/repos# p0 j& X2 i& H6 V, O9 i
SVN-fs-dump-format-version: 1
# y0 Y8 I! D( s: C0 L4 g1 I; ]  YRevision-number: 0
# {& G" p6 a9 X0 N* Dumped revision 0.8 s: w3 Y) h" s$ N
Prop-content-length: 56" Z! z" c& t. l, i# g& c; l
Content-length: 56
( Y1 {: E5 K' k5 y9 z2 f7 ~
, b9 I, r5 B$ F) o& l! n! _9 c0 g; i, N7 u: _
从版本库增量转储一个单独的事务:5 B3 H+ ?# ]* d: \; Q- S
! q  T' s5 k* X" j
$ svnadmin dump /usr/local/svn/repos -r 21 --incremental 6 N- O. g) I& X
* Dumped revision 21.* y: @; ]+ `) C% ?# |
SVN-fs-dump-format-version: 1! @* o4 p+ s' w  p) U/ h
Revision-number: 219 a9 J  P$ ^9 T0 O
Prop-content-length: 101# F2 n. Q7 m+ W9 k7 E
Content-length: 1015 f) @+ I& B% @1 ?7 R% Y1 G& |

* t3 Y, d" Y  J- X7 G, ^  s3 S
5 j3 z+ c% D2 E- |
9 J' |' X- [/ `0 K! [7 g3 N; w4 M二.hooks简介
9 d, f" i3 ~! S; j; ^9 D
- a% a, T5 Z) L' x8 L钩子脚本在每个repos的hooks目录下面。" W  C0 m, F6 D- q- {* P
每个里面都有模板,名字如下:5 k# m- `- x- n2 |& {7 Q( ?3 I
post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl
$ n3 h. Q0 A0 Y- z" w- i3 Vpost-lock.tmpl    post-unlock.tmpl          pre-lock.tmpl    pre-unlock.tmpl
, u( \& K/ ~7 d1 o3 N  O  l" I5 |& `" |0 m0 L3 n
下面对每个钩子的功用 做一个说明!
* _6 A6 B0 r8 _" q
1 X1 W. W3 Z( }' @' [+ q7 c1)start-commit — 开始提交的通知
% ?( o9 t2 m- n8 d( s6 U7 N% C5 L0 ?' j1 K描述
5 ]  _( E. Q6 S# Z. q6 w6 _) h! O' v/ G# B
start-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。
  b5 z2 @7 u$ O& [# N; H" u) ~2 f
9 m" C& V' J: _+ F* z6 E如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。
- n3 x( ?( _+ C+ f/ ~# h1 {2 h输入参数2 h& V, ]+ C4 ^. a2 Q9 B( [0 @+ y8 D
; O. ]# H3 _8 Q( z" `+ W5 K
传递给你钩子程序的命令行参数,按照顺序是:
& j  d1 }' d3 e! F1 u- r1.版本库路径
: n; x0 o! F* J. N2.认证过的尝试提交的用户名5 \. z' F4 x8 w2 B
3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).& z5 S# k9 ^) [/ ]

$ {! P2 f; Q- }2)pre-commit — 在提交结束之前提醒。5 ]$ }6 ^" k  @! R  V+ z: [
描述
/ }6 I( m! w  i& i5 Q, u6 bpre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。
( ]9 o2 z8 U' E  p0 Y如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。
- ?0 t  K( V3 H: W- x) f: L2 ]( J! b# l; g
输入参数' C2 S; h! Z0 n2 ]9 e1 D
1 X- Z7 j0 N! N! s! R
传递给你钩子程序的命令行参数,按照顺序是:. j5 B  f1 z9 G' r9 j1 N1 R2 I
1.版本库路径* i! e, I5 z  Y% S1 _' }* ?9 t' q
2.提交事务的名称4 v8 t: q* A4 R* a

  |1 ?/ z0 a0 ^% q7 {# H. J3)post-commit — 成功提交的通知。) m: p: k& d# z' K7 |: |. G, m
描述
& v" G. x2 B; Y, g1 H
) _7 H- F# X# F) V5 B# gpost-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。
( g: `/ j* W- `# ~7 w1 Z- P" X如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。: P8 J1 m  z$ n" t
输入参数7 U8 n8 ?  R3 f) Q$ ~9 A! @3 K
传递给你钩子程序的命令行参数,按照顺序是:
' v. Z% E3 x) w5 Z1.版本库路径
# H' [+ e; i7 {, ~, k2.提交创建的修订版本号
1 Q8 |+ W8 [5 d* G7 J" i. @) d4 B" k6 r! v/ w: h0 m
4)pre-revprop-change — 修订版本属性修改的通知。; S4 u: Y. W9 S' R& n: I% `
描述
  E$ \" q8 u. v$ N# xpre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。6 S: `7 i2 D3 M  z
如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。( j* s3 A- ?1 c
输入参数' r% H- I1 O% {( C& F
传递给你钩子程序的命令行参数,按照顺序是:
5 n  s- ]  Y: l1.版本库路径, ?/ E* ~/ ]1 K# i1 B% L0 T
2.要修改属性的修订版本
" R+ \: h6 r$ _- c; X1 P: k% m3.企图修改属性的认证用户名
% D. Q6 g  s% n8 j* g* n4.属性名称已修改* |5 ~9 B1 x; F- M" B# N
5.变更描述:A (添加的),D (删除的)或M (修改的). C4 v2 P- Z4 X6 ~, d, P. r9 Y
4 ^$ e! E% j6 L. m
此外,Subversion 通过标准输入将属性的新值传递给钩子程序。& h7 r9 U  ^% Y; c; I
, ~7 t2 m$ V8 W
5)post-revprop-change — 修订版本属性修改成功的通知) G9 V! ?. t4 R0 D  @
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
, J5 t8 ^1 K; S如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
" r: M6 D( r8 Y0 m* B7 s输入参数6 m$ n0 M8 Z9 Q. T. T
传递给你钩子程序的命令行参数,按照顺序是:( b6 T) B' V( W  Z) H/ B+ P, T

$ d# t9 x( x. n$ V5 M' h/ s1.版本库路径  p: a+ P5 c, F7 T! A# p" }
2.经修改属性的修订版本& k5 G6 {  f/ p1 ]6 R. _
3.做出修改的认证用户名
( L% P2 C! v6 K. X% n4.属性名称已修改
: t4 Q# ]- L! v' Q5.变更描述:A (添加的),D (删除的)或M (修改的)
# x0 P+ n$ I* a8 A3 t: f4 n8 W& f6 s3 A. ^. R
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。1 E: e6 l3 c4 z/ X

, c5 H% D8 \! k( V' a( r& n( K6)post-revprop-change — 修订版本属性修改成功的通知" ~$ }* I* ~8 L3 h9 f0 C8 a4 b$ U
描述
( S6 W  _# m4 a$ J: epost-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。6 F) X- a8 @$ e- S
如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
2 ~* Y- s/ V& ]输入参数# ^/ Y" l1 y) A  A" n
2 G" j- Y$ ]. L9 k9 W; J
传递给你钩子程序的命令行参数,按照顺序是:: _: F/ q% Y# o/ ]* R7 T. K
   1.版本库路径
( j7 ~% u, k6 K  [   2.已经修改属性的修订版本
( O9 g4 R) {, \( P6 T   3.做出修改的认证用户名& f. V8 q7 Q' i2 R5 m* b
   4.属性名称已修改
' r' w* t8 Z7 M2 w# }' i- D   5.变更描述:A (添加的),D (删除的)或M (修改的)" a8 F% f; \) g, W: `
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。6 M1 o5 O8 u0 t; T+ E8 u" ^# a

$ q: l9 m& h' F, n+ u7)post-lock — 成功锁定路径的通知。
* I6 \1 A; A- ]% w  F  E- w, L/ e描述
% r& c4 s" N8 E4 V, B  K, h0 @. ypost-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。( q) Y0 S7 [7 a
如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
! r( m7 f9 T1 n+ }$ P: t输入参数
- k# u' F9 n( y# j& R传递给你钩子程序的命令行参数,按照顺序是:
5 c; [. p- F" W( t6 K1.版本库路径
0 C( L' T% \" t0 s  m2.锁定路径的认证用户名
# u' A/ Q# N  r# k" R, |1 K/ O, B9 v
此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。0 L4 d9 [1 Q  r( o
. f8 S7 |, c) _" J1 N
8)pre-unlock — 路径解锁尝试的通知。
7 i6 V: z+ F  }( [2 c% S) q描述! Z! R9 m& e% e, Q
pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。
/ @1 u- l2 [. W: B$ H! l% Y如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。
' |/ w0 p& ?6 a9 i1 `7 O) p& `输入参数6 }2 F8 ^+ \/ k2 e" r
: @( N7 k9 }" c9 K" R) G
传递给你钩子程序的命令行参数,按照顺序是:
9 l" F: q0 @& ]* }' ~8 \2 G
& ^; P7 j4 S/ v9 y. ?, \   1.版本库路径
# H/ H% `! [1 E8 m! v   2.Versioned path which is to be unlocked/ n6 W( g$ q7 ~$ y7 m
   3.Authenticated username of the person attempting the unlock
. v% Q) Z4 s  I6 d/ @) K
. g: Q, v" U, v4 a+ p3 y6 n# Q9)post-unlock — 路径成功解锁的通知。) C. t( K; F5 ^6 J- \# N
描述
" _6 a/ e$ S: }; s8 k; opost-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。' u7 L4 }+ ]- x3 U5 b7 Z
如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。9 O) S0 z, [( j4 B  W5 U+ Z
输入参数9 B. ]7 K' i; c
传递给你钩子程序的命令行参数,按照顺序是:
8 P( z9 B5 `, @- l% W- U# M( u1.版本库路径
1 b3 E+ h  `0 O/ m7 G2.路径解锁的认证用户名
$ W# G: X# ]0 U+ T
  y$ [7 W# n& g: a  _( n此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。: n: Q% k* y8 d; [  f- Y/ S/ T

7 ]- E: ?+ R1 |( ?! @
, _+ g7 {( M  {7 l* a: T& Y! E: y三.hooks本应用demo* {  M4 U1 L9 w7 A2 f
就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。
' V7 B9 b" `# B: i
% }4 a+ ^7 _* z- Z" u5 w* v1.如果不想开发人员有删除权限,只有SCM用户有删除权限.... J$ _' e1 N2 L" N

$ t9 [  [) v: u& }; }0 W#############################################+ l) ^6 q5 J$ }7 I% f2 }2 ^
REPOS="$1"3 _3 G- C; t7 q7 |# d+ r# u
TXN="$2"/ l5 X+ s6 A8 `# A
RES="OK"! h. q& Z. [! Q
#USER="$3"
8 [9 ~2 Z+ F' y. i7 R8 A) aSorry~没有这个变量 呵呵 : W% p" Y  G, C  R
USER可以这么获取
7 t# r5 Z3 u2 H+ n  NUSER=`svnlook author -t $TXN $REPOS`4 c: p* b1 p  @* j9 {( c# A
SCMLIST="user1,user2,user3" #scm人员列表9 R; G7 e# k7 P8 S% w4 }' t
- G+ x5 @) G, s' O% [1 J6 k
if [ `echo $SCMLIST|grep -w  $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断( k9 H( v+ U1 |7 R5 T5 a
then# O0 U7 p( ]4 V" p
SVNLOOK=/usr/bin/svnlook
8 w5 s: N& \! G: \! ]LOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
8 ^+ e+ _; g, Y  {% HLOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
. e% f* n( g# q. q, ^
6 d. S3 g5 x) j3 Nif [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]
# G6 d, U( R+ A& s1 f8 O4 p        then
* s6 n: H8 q- Y0 |) C( v* A        echo -e "\n You Don't have the pemmision of delete  " 1>&2
! D5 ?, F5 M7 d7 [; E% ]        exit 1
7 q5 h+ i. J; Q% }: qfi
# u) u/ f# @8 Y, s. z, W; P/ N% Ifi
$ y* H% }, b9 o" Q# D#############################################
( j3 Q" d5 _+ m5 R" M( L8 c
! j; X# J8 q, f$ Q- M; [4 S( a. N- V  H5 x4 ]& F2 s

! E- A) `- O4 M- ~0 n8 F" k, {! N3 d1 L2.提交完毕邮件通知: d1 e7 k7 s+ k3 _: P- c: p, d
http://bbs.scmlife.com/thread-14543-1-1.html) L! k& ], k9 k- K+ M1 x6 I5 t
见此帖子1 x; C3 r& e0 W
3.增量备份
4 k  v& ~$ R/ H( `( N8 c5 f7 M) b- j+ w

! J) N0 q& `  ]- m' Q4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件
6 ?5 W) G. n' u: o4 npre-commit
% D" a, K: E# {###############################
) n- k9 E$ r  Q% T( tREPOS="$1"
, W3 \3 R; J2 J1 B3 O# Z; u0 s/ U7 KTXN="$2"
+ U5 k: |3 E% E" C: y* l" X- Y3 zRES="OK"
& f/ C5 |& s* e" }4 dst="k2/branch/BR-K2-1_0_001_20100316/"
% c" G+ G2 {) m# hABSUSER=$($SVNLOOK author $REPOS -t $TXN)
9 J( w2 ?5 t! m8 P' D$ U9 Nif [ $ABSUSER != "ads" ]
# U/ r% q# R5 n" Y3 _3 Q1 t4 Lthen5 H' ?1 P& e: n! Q: ]
        if [ "`echo $files|grep $st`" =   "$files" ]
% M" @/ o  f# s. D8 v3 L        then; G. f# b4 W" u2 M6 i# p& x
                echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2
* E3 R) h  L7 a3 Y/ Q$ f, P                exit 1
# H6 d& W" ^* K' H        fi
* M* v, `. L# F0 }+ q/ Wfi
! K/ w+ v' E% a7 c7 f) T
; K; l" _; b0 K6 t' wexit 0
6 ]! u/ u4 k! e/ S
: [, t3 r% Z8 }5 p- B! b###############################( Y7 a/ N& N/ |
自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。# R8 O. i( X9 k
# i# p- [4 N( @) P# n
5.钩子脚本 对锁的管理( i6 y, ~" P( L, Z% ]
http://bbs.scmlife.com/viewthrea ... highlight=%2Bgo2cxg
9 j; c9 R8 @; Q! g- f4 U见这个帖子 有详细的说明。
; ?# J8 k- E9 L# \' \
* A9 M3 w. J5 |  Y0 B6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)
2 ~7 n. V& o1 ~& Z* {+ epre-commit! {* f' a1 j) Y: A
########################################
8 E7 H" c% v0 K8 UREPOS="$1"; @0 [3 u. e9 }
TXN="$2"6 N2 h1 T/ q- n  J: r8 M8 ?
RES="OK"4 o0 c2 i. J# g) J0 F
MAX_SIZE=10240000
0 Q! q% ~$ n: f' hfiles=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}'); R- T; ]% E% f  j
for f in $files. ]. n+ H% a5 u
do
2 p0 s* E& h3 A4 c' T4 i! v- dfilesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)
! |% @8 V) W1 x- A3 w0 Dif [ $filesize -gt $MAX_SIZE ] ; then' S# V# d! {, [6 z
echo "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr$ h9 n/ W. |1 I. D0 o
exit 1
0 n& Y5 M, \) {% @  h& Y% dfi
( i% g# }8 z6 V" c& C9 h4 Rdone
: j. n$ M* S; Z) V/ @3 `* Z########################################- E2 \) \2 I- E. w* w2 ~) `
当然 这里还可以做一些其他的限制& O* N  |4 L3 D/ v# q% h
比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制
$ H' n! M* _+ P( f: `! Z4 O' Q2 _+ t8 c. ~8 w& @- _
[ 本帖最后由 go2cxg 于 2010-7-2 17:24 编辑 ]

本帖被以下淘专辑推荐:

  • · SVN|主题: 9, 订阅: 1
  • · SVN使用|主题: 1, 订阅: 1
发表于 2010-7-16 15:24:51 | 显示全部楼层
感谢楼主分享" r' v8 H, a& f$ b
学习一下2 Q3 _4 p3 Z4 j9 v8 ~5 c
svn才刚入门呢。
回复 支持 1 反对 0

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2010-6-30 17:23:26 | 显示全部楼层
帖子比较长) v* M6 W% [4 X) b+ ~2 Z- X2 E
整理的时间较长 大家耐心看!
5 F; P! W* Z, W有需求 尽管跟帖: t. C5 n+ _* H8 U4 Y* N
不需再另起贴~
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-7-2 01:26:57 | 显示全部楼层
果然很长很强大!
6 ?9 m! B, i& `( T, T* ]  u0 B
  Z& K- U5 t  w强烈推荐所有使用Subversion作为配置管理工具的朋友都要好好学习下此帖子,可将Hooks一网打尽,从而实现个性化定制需求,进阶SCM。。。
. d' V; e, \& o% O; j5 y1 R, I- s* ?+ }7 i; P+ d5 _, R4 [
感谢小光分享经验心得!!
回复 支持 反对

使用道具 举报

发表于 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-1-23 01:55 , Processed in 0.078486 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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