在python/bash脚本中编写Git钩子

在python/bash脚本中编写Git钩子,git,githooks,Git,Githooks,我最近需要编写git钩子,以便所有提交都引用特定的票证 我希望有一个开始学习的地方。pro git书中的所有内容都是用Ruby编写的。既然Ruby不是我的强项,有人能分享用其他语言编写的git钩子教程吗?(我特别喜欢Python或Bash脚本。)是将Python用于钩子的一个示例。一般来说,钩子与语言无关。您可以使用该脚本执行一些工作,或者使用0/其他返回代码退出,以改变git进程的流程。git附带的示例是用shell脚本编写的;每个回购协议的.git/hooks中都有一些基本的回购协议,而/u

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


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

是将Python用于钩子的一个示例。一般来说,钩子与语言无关。您可以使用该脚本执行一些工作,或者使用0/其他返回代码退出,以改变git进程的流程。

git附带的示例是用shell脚本编写的;每个回购协议的
.git/hooks
中都有一些基本的回购协议,而
/usr/share/doc/git core/contrib/hooks
中安装了更高级的回购协议


通过
$mangithooks

还提供了关于各种钩子的更多信息,我发现在python上编写git钩子很容易。这是python上post接收钩子的一个示例。提供的示例在不同的文件夹中部署master和develop分支机构(master的更改将推送到生产网站,develop分支机构的更改将推送到qa网站)


如果措辞得当,这可能是一个很好的一般性问题,因此我将其改写为更一般的问题,而不是语言特定的问题(同时仍然尊重提问者在python和bash方面的专业知识)。如果有人想帮助清理它,那么它就足够一般,可以链接到非正式的GIT FAQ中,非常感谢。您命名的变量
branch
实际上是远程引用(因此我喜欢使用
remote\u ref
)。这意味着#2和#3的条件并没有真正检查它们声称检查的内容。例如,使用命令“
git push origin develope:master”
第二个条件认为您正在推动主分支,但您没有--它推动到主分支,但不是从主分支推动。本例中的条件假设您只将本地主机推送到远程主机,其他命名的分支也是如此。还要注意,
old
是本地引用,
new
是本地提交的SHA-1。下面是通过STDIN提供给hook的完整行:
@Dennis抱歉,我不理解你的评论。git push origin develope:master您将local.develope推送到origin.master。好吧,但你们推进主人并不是因为主人或其他早午餐。我试图理解我没有理解你的问题或者你不知道solution@Dennis我们的想法是在服务器上有生产和质量保证站点。主分支绑定到生产现场,开发分支绑定到qasite@Dennis现在我明白你的意思了。实际上,它是开发人员的一个远程分支(但是是您将代码推送/部署到的服务器的本地分支)
#!/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)