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