2011-04-27 76 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