最近、すべてのコミットが特定のチケットを参照するように、git フックを作成する必要がありました。
学びのスタート地点になればと思っていました。pro git book の内容はすべて Ruby で書かれています。Ruby は私の得意分野ではないので、他の言語で書かれた git フックに関するチュートリアルを共有できる人はいますか? (私は特に Python または Bash スクリプトを好みます。)
フックに Python を使用する例を次に示します。一般に、フックは言語に依存しません。スクリプトを使用して何らかの作業を行うか、0/other のリターン コードで終了して git プロセスのフローを変更します。
gitに付属する例は、シェルスクリプトで記述されています。各リポジトリにはいくつかの基本的なものがあり、.git/hooks
にインストールされているより高度なものがあり/usr/share/doc/git-core/contrib/hooks
ます。
を介して利用できるさまざまなフックに関する詳細情報もあります$ man githooks
。
Python で git hook を書くのは簡単だということがわかりました。Python での post-receive フックの例です。提供された例では、マスター ブランチと開発ブランチが異なるフォルダーにデプロイされます(マスターの変更は運用 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)