web-dev-qa-db-ja.com

Python / bashスクリプトでGitフックを書く

最近、すべてのコミットが特定のチケットを参照するために、gitフックを作成する必要がありました。

私は学び始める場所を望んでいました。 pro gitbookの内容はすべてRubyで書かれています。 Rubyは私の強みではないので、他の言語で書かれたgitフックに関するチュートリアルを誰かが共有できますか?(特にPythonまたはBashスクリプトが好きです。)

26
myusuf3

Here は、フックにPythonを使用する例です。一般に、フックは言語に依存しません。スクリプトを使用して、作業を行うか、0 /で終了します。 gitプロセスのフローを変更するための他の戻りコード。

21
Peter Loron

Gitに付属する例は、シェルスクリプトで記述されています。各リポジトリの.git/hooksにはいくつかの基本的なものがあり、/usr/share/doc/git-core/contrib/hooksにインストールされているより高度なものがあります。

$ man githooksを介して利用できるさまざまなフックに関する詳細情報もあります。

8
intuited

Pythonでgitフックを書くのは簡単だとわかりました。これは、Pythonの受信後フックの例です。提供されている例では、マスターと開発をデプロイします異なるフォルダー内のブランチ(マスターの変更は本番Webサイトにプッシュされ、開発ブランチの変更は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)                         
5
Roman Podlinov