27

我最近需要编写 git 钩子,以便所有提交都引用特定的票证。

我希望有一个地方开始学习。pro git 书中的所有内容都是用 Ruby 编写的。由于 Ruby 不是我的强项,任何人都可以分享关于用其他语言编写的 git hooks 的教程吗?(我特别喜欢 Python 或 Bash 脚本。)

4

3 回答 3

24

是一个使用 Python 作为钩子的示例。一般来说,钩子与语言无关。您可以使用脚本来完成一些工作或以 0/other 返回码退出以更改 git 进程的流程。

于 2010-07-22T18:10:53.793 回答
8

git自带的例子都是用shell脚本写的;每个 repo中都有一些基本的,.git/hooks而更高级的安装到/usr/share/doc/git-core/contrib/hooks.

还有更多关于各种钩子的信息可以通过$ man githooks.

于 2010-07-22T18:35:45.240 回答
5

我发现在 python 上编写 git hook 很容易。这是 python 上的 post-receive 钩子的一个例子。提供的示例将 master 和 development 分支部署在不同的文件夹中(master 的更改将被推送到生产网站,develop 分支的更改将被推送到 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)                         
于 2014-07-23T15:05:56.723 回答