html tool

2016年7月24日星期日

git钩子

介绍:https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90
--------------------------------------------------------
git 介绍

  • 参考:https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90
  • 钩子定义:和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本
    • 分为客户端和服务器两种
    • 客户端钩子由诸如提交和合并这样的操作所调用
    • ~ shell .mm
    • 服务器端钩子作用于诸如接收被推送的提交这样的联网操作
  • 钩子位置: git init 后在.git/hooks中
    • 示例脚本,基本是shell,也支持perl。
    • 不过,任何正确命名的可执行脚本都可以正常使用 —— 你可以用 Ruby 或 Python,或其它语言编写它们。 这些示例的名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀
      • 如果使用python脚本直接在代码中声明为#!/usr/bin/python 就可以
        •  
    • 把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中,即可激活该钩子脚本。 这样一来,它就能被 Git 调用。
  • 客户端钩子
    • 提交工作流钩子、电子邮件工作流钩子和其它钩子。
      • NOTE 需要注意的是,克隆某个版本库时,它的客户端钩子 并不 随同复制。 如果需要靠这些脚本来强制维持某种策略,建议你在服务器端实现这一功能。(请参照 使用强制策略的一个例子 中的例子。)
        [popexizhi]只限本地使用,可以定制本地特殊的git策略。
    • 提交工作流钩子
      • pre-commit
        • 钩子在键入提交信息前运行
          • 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。 如果该钩子以非零值退出,Git 将放弃此次提交
            • [popexizhi]一个不错的使用testcase的位置
          可以用 git commit --no-verify 来绕过这个环节
          Git提供的示例脚本pre-commit.sample禁止提交在路径中使用了非ASCII字符(如中文字符)的文件。如果确有使用的必要,可以在Git配置文件中设置配置变量hooks.allownonascii为true以允许在文件名中使用非ASCII字符。Git提供的该示例脚本也对不规范的空白字符进行检查,如果发现则终止提交。
        • 【popexizhi:问题使用shell时,pwd测试为空why?】
      • + - prepare-commit-msg
        • 钩子在启动提交信息编辑器之前,默认信息被创建之后运行。 它允许你编辑提交者所看到的默认信息
          该钩子接收一些选项:存有当前提交信息的文件的路径、提交类型和修补提交的提交的 SHA-1 校验。 它对一般的提交来说并没有什么用;然而对那些会自动产生默认信息的提交,如提交信息模板、合并提交、压缩提交和修订提交等非常实用。 你可以结合提交模板来使用它,动态地插入信息。
      • commit-msg
      • post-commit
        • 钩子在整个提交过程完成后运行。
        • 它不接收任何参数,但你可以很容易地通过运行 git log -1 HEAD 来获得最后一次的提交信息。 该钩子一般用于通知之类的事情。
    • + - 电子邮件工作流钩子
      • 它们都是由 git am 命令调用的,因此如果你没有在你的工作流中用到这个命令,可以跳到下一节
    • 其它客户端钩子
  • 服务器端钩子
    • 作为系统管理员,你还可以使用若干服务器端的钩子对项目强制执行各种类型的策略。 这些钩子脚本在推送到服务器之前和之后运行
    • pre-receive
      • 处理来自客户端的推送操作时,最先被调用的脚本是 pre-receive。

      • 它从标准输入获取一系列被推送的引用。如果它以非零值退出,所有的推送内容都不会被接受,
    • update
      • update 脚本和 pre-receive 脚本十分类似,不同之处在于它会为每一个准备更新的分支各运行一次。 假如推送者同时向多个分支推送内容,pre-receive 只运行一次,相比之下 update 则会为每一个被推送的分支各运行一次。

        它不会从标准输入读取内容,而是接受三个参数:引用的名字(分支),推送前的引用指向的内容的 SHA-1 值,以及用户准备推送的内容的 SHA-1 值
        如果 update 脚本以非零值退出,只有相应的那一个引用会被拒绝;其余的依然会被更新。
    • + - post-receive
      • post-receive 挂钩在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户。 它接受与 pre-receive 相同的标准输入数据
        它的用途包括给某个邮件列表发信,通知持续集成(continous integration)的服务器,或者更新问题追踪系统(ticket-tracking system) —— 甚至可以通过分析提交信息来决定某个问题(ticket)是否应该被开启,修改或者关闭。 该脚本无法终止推送进程,不过客户端在它结束运行之前将保持连接状态,所以如果你想做其他操作需谨慎使用它,因为它将耗费你很长的一段时间。 

没有评论:

发表评论