2010-07-22 19 views
24

我最近需要編寫git掛鉤,所有提交引用特定的票據。在python/bash腳本中編寫Git鉤子

我希望有一個地方可以開始學習。 pro git書中的所有內容都是用Ruby編寫的。由於Ruby不是我的強項,任何人都可以分享有關用其他語言編寫的git鉤子的教程嗎? (我特別喜歡Python或Bash腳本。)

+3

措辭不當,這可能是一個很好的一般問題,所以我已經將它重寫爲更通用,更少語言特定(同時仍尊重提問者在python和bash方面的專業知識)。如果有人想幫助更多地清理它,以便它足夠通用,可以鏈接到非官方GIT常問問題http://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide,這將不勝感激。 – 2010-07-22 18:12:04

+1

謝謝。欣賞它,肯 – myusuf3 2010-07-22 18:17:42

回答

16

Here是一個使用Python進行鉤子的例子。一般來說,鉤子是語言不可知的。您可以使用該腳本來完成一些工作,或者使用0 /其他返回碼退出來更改git進程的流程。

7

git附帶的例子是用shell腳本編寫的;每個回購的.git/hooks有一些基本的回報,而更高級的回報則安裝到/usr/share/doc/git-core/contrib/hooks

還有更多的信息可通過$ man githooks獲得各種掛鉤。

5

我發現很容易在python上編寫git鉤子。這是python後接收鉤子的一個例子。提供的示例部署主機和開發不同的文件夾分支(主機變化將被推到生產的網站,並在開發分支的更改將被推到QA網站)

#!/usr/bin/env python                  
# -*- coding: UTF-8 -*-                 
#post-receive                    

import sys                    
import subprocess                   

# 1. Read STDIN (Format: "from_commit to_commit branch_name")        
(old, new, branch) = sys.stdin.read().split()            

# 2. Only deploy if master branch was pushed            
if branch == 'refs/heads/master':               
    subprocess.call('date >> ~/prod-deployment.log', shell=True)       
    subprocess.call('GIT_WORK_TREE=/home/ft/app.prod git checkout master -f', shell=True) 
    subprocess.call('cd ../../app.prod;bower update', shell=True)       

#3. Only deploy if develop branch was pushed            
if branch == 'refs/heads/develop':              
    subprocess.call('date >> ~/dev-deployment.log', shell=True)       
    subprocess.call('GIT_WORK_TREE=/home/ft/app.dev git checkout develop -f', shell=True) 
    subprocess.call('cd ../../app.dev;bower update', shell=True)       
+0

你命名'branch'的變量實際上是遠程引用(所以我喜歡使用'remote_ref')。這意味着#2和#3的條件並不真正檢查他們聲稱要檢查的內容。例如,使用'git push origin develop:master'命令,第二種情況認爲你推動主分支,但你不是 - 它將*推給*主,而不是推*從*主。示例中的條件假定您只將本地主服務器推送到遠程主服務器,並且同樣針對其他命名分支。 – Dennis 2014-12-17 16:44:03

+0

還要注意'old'是本地引用,'new'是本地提交的SHA-1。以下是通過STDIN提供的完整線路:'' – Dennis 2014-12-17 16:50:21

+0

@Dennis抱歉,我不瞭解您的評論。 git push origin develop:掌握你推local.develop爲origin.master。好吧,但你推進主人並不是主人或其他早午餐。我試圖理解我沒有得到你的問題的觀點,或者你沒有得到解決方案的想法 – 2015-02-26 11:50:34