【问题标题】:Writing Git hooks in python/bash scripts [closed]在 python/bash 脚本中编写 Git 钩子 [关闭]
【发布时间】:2011-03-19 17:15:40
【问题描述】:

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

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

【问题讨论】:

  • 措辞得当,这可能是一个很好的笼统问题,所以我将其改写为更笼统,更少语言特定(同时仍然尊重提问者在 python 和 bash 方面的专业知识。)如果有人想帮助清理它,以便它足够通用,可以链接到非官方的 GIT 常见问题解答stackoverflow.com/questions/315911/…,非常感谢。

标签: git githooks


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    还可以通过$ man githooks 获得有关各种挂钩的更多信息。

    【讨论】:

      【解决方案3】:

      我发现在 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)                         
      

      【讨论】:

      • 你命名为branch的变量实际上是远程引用(所以我喜欢用remote_ref)。这意味着 #2 和 #3 的条件并没有真正检查他们声称要检查的内容。例如,使用命令git push origin develop:master,第二个条件认为您正在推送主分支,但您不是——它正在推送 to 主分支,而不是推送 from掌握。示例中的条件假设您仅将本地 master 推送到远程 master,对于其他命名分支也是如此。
      • 另请注意,old 是本地引用,new 是本地提交的 SHA-1。这是通过 STDIN 提供给钩子的完整行:<local ref> <local sha1> <remote ref> <remote sha1>
      • @Dennis 抱歉,我不明白您的评论。 git push origin develop:master 你将 local.develop 推送到 origin.master。好的,但你推入大师与大师或其他早午餐无关。我试图了解我没有明白你的问题,或者你没有了解解决方案
      • @Dennis 这个想法是您在服务器上有生产和质量保证站点。 master 分支绑定到生产站点,develop 分支绑定到 qa 站点
      • @Dennis 现在我明白了。实际上,它是开发人员的远程分支(但您推送/部署代码的服务器的本地分支)
      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2015-12-05
      相关资源
      最近更新 更多