2011-04-27 75 views
25

我想建立一个git钩子,它根据传入标签创建一个CDN风格的目录结构。因此,例如,如果本地存储库中的最后一个标签是“v1.2.1”,并且我使用“v1.2.2”提交了一个提交,它应该会看到新标签并直接将存储库克隆到新的存储库中(../1.2 .2)据此。如何对git钩子中的新标签做出反应?

我很确定我想附加这个post-receive,但是我找不到有关如何读取传入标签的git钩子的文档中的任何东西。它们是在不同的钩子上交付的?我是否真的需要让shell脚本运行git命令来查看是否有任何新提交有新标签?

谢谢!

回答

30

标签与其他任何(如提交)相同。
如果标签被推送到一个post-receive hook的回购,该钩子将被调用,并将列出所有更新的参考,除了它们的名称(在其标准输入)之外,所有参考的旧值和新值都是。例如

查看此服务器post-receive email挂钩。

#!/bin/sh 

. $(dirname $0)/functions 

process_ref() { 
    oldrev=$(git rev-parse $1) 
    newrev=$(git rev-parse $2) 
    refname="$3" 

    set_change_type 
    set_rev_types 
    set_describe_tags 

    case "$refname","$rev_type" in 
     refs/tags/*,tag) 
     # annotated tag 
     refname_type="annotated tag" 
     function="atag" 
     short_refname=${refname##refs/tags/} 
     # change recipients 
     if [ -n "$announcerecipients" ]; then 
      recipients="$announcerecipients" 
     fi 
     ;; 
    esac 
} 

while read REF; do process_ref $REF; done 

对于这个工作,你还必须从上述的例子钩库安装the functions file

+0

当我推送标签时,“$ 1,$ 2和$ 3”全部为空。 – chovy 2013-11-07 09:58:00

+0

@chovy strage。这个类似的脚本(http://www.kaarsemaker.net/blog/2013/10/16/automatically-pushing-local-git-repositories-other-sources/)没有相同的问题。 – VonC 2013-11-07 13:13:09

+0

我在答案中修正了这个例子,以便它是一个完整的bash脚本,对于那些懒得跟随post-receive链接的人 – 2014-08-25 19:55:31