前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >git钩子和lefthook

git钩子和lefthook

原创
作者头像
码农小辉
发布于 2022-09-06 07:51:41
发布于 2022-09-06 07:51:41
1.1K0
举报

TOC

git钩子和lefthook

背景

在项目开发过程中,我们经常需要规范化代码配置流程,此时需要一种工具,开发人员在使用git过程中按照要求的规范进行提交代码和各种代码检测或其他附加处理逻辑。

git钩子

什么是git钩子

通过设置钩子可以让开发人员在提交代码仓库的各个阶段进行一些自定义处理。钩子又分为git客户端钩子、git服务端钩子。例如git客户端在进行代码合并、提交的时候可以通过客户端钩子进行拦截,先执行完钩子设置的逻辑后再进行真正的代码合并、提交逻辑。服务端钩子可以在代码推送到仓库之后之后触发。

常见的git客户端钩子

  • pre-commit 钩子在键入提交信息前运行。 它用于检查即将提交的快照。
  • prepare-commit-msg 钩子在启动提交信息编辑器之前,默认信息被创建之后运行。
  • commit-msg 钩子接收一个参数,此参数即上文提到的,存有当前提交信息的临时文件的路径。
  • post-commit 钩子在整个提交过程完成后运行。
  • pre-rebase 钩子运行于变基之前,以非零值退出可以中止变基的过程。
  • post-rewrite 钩子被那些会替换提交记录的命令调用,比如 git commit --amendgit rebase(不过不包括 git filter-branch)。
  • pre-push 钩子会在 git push 运行期间, 更新了远程引用但尚未传送对象时被调用。

常见的git服务端钩子

服务端钩子需要在提供git服务端进行配置。

  • pre-receive处理来自客户端的推送操作时,最先被调用的脚本是 pre-receive
  • update 脚本和 pre-receive 脚本十分类似,不同之处在于它会为每一个准备更新的分支各运行一次。
  • post-receive 挂钩在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户。

lefthook

项目地址

lefthook是由go语言开发的适用于 Node.jsRuby 或任何其他类型项目的快速且强大的 Git 钩子管理器。 代码仓库地址

  • 快速地。它是用 Go 编写的。可以并行运行命令。
  • 强大的。通过配置中的几行,您可以仅检查pre-push挂钩上更改的文件。
  • 简单的。它是一个无依赖的二进制文件,可以在任何环境中工作。

依赖关系

例子

代码语言:yaml
AI代码解释
复制
# On `git push` lefthook will run spelling and links check for all of the changed files
pre-push:
  parallel: true
  commands:
    spelling:
      files: git diff --name-only HEAD @{push}
      glob: "*.md"
      run: npx yaspeller {files}
    check-links:
      files: git diff --name-only HEAD @{push}
      glob: "*.md"
      run: npx markdown-link-check {files}

pre-push常用的一些例子

代码语言:yaml
AI代码解释
复制
pre-push:
  parallel: true
  commands:
    danger:
      run: bundle exec rake danger_local
    eslint:
      tags: frontend style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: '*.{js,vue}'
      run: yarn run lint:eslint {files}
    haml-lint:
      tags: view haml style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: '*.html.haml'
      run: REVEAL_RUBOCOP_TODO=0 bundle exec haml-lint --config .haml-lint.yml {files}
    markdownlint:
      tags: documentation style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: 'doc/*.md'
      run: yarn markdownlint {files}
    yamllint:
      tags: backend style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: '*.{yml,yaml}'
      run: scripts/lint-yaml.sh {files}
    stylelint:
      tags: stylesheet css style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: '*.scss{,.css}'
      run: yarn stylelint {files}
    prettier:
      tags: frontend style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: '*.{js,vue,graphql}'
      run: yarn run prettier --check {files}
    rubocop:
      tags: backend style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: '*.{rb,rake}'
      run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --parallel --force-exclusion {files}
    graphql_docs:
      tags: documentation
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: '{app/graphql/**/*.rb,ee/app/graphql/**/*.rb}'
      run: bundle exec rake gitlab:graphql:check_docs
    vale:  # Requires Vale: https://docs.gitlab.com/ee/development/documentation/testing.html#install-linters
      tags: documentation style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: 'doc/*.md'
      run: 'if [ $VALE_WARNINGS ]; then minWarnings=warning; else minWarnings=error; fi; if command -v vale > /dev/null 2>&1; then if ! vale --config .vale.ini --minAlertLevel $minWarnings {files}; then echo "ERROR: Fix any linting errors and make sure you are using the latest version of Vale."; exit 1; fi; else echo "ERROR: Vale not found. For more information, see https://docs.errata.ai/vale/install."; exit 1; fi'
    gettext:
      skip: true  # This is disabled by default. You can enable this check by adding skip: false in lefhook-local.yml https://github.com/evilmartians/lefthook/blob/master/docs/full_guide.md#skipping-commands
      tags: backend frontend view haml
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD | while read file;do git diff --unified=1 $(git merge-base origin/master HEAD)..HEAD $file | grep -Fqe '_(' && echo $file;done; true
      glob: "*.{haml,rb,js,vue}"
      run: bin/rake gettext:updated_check
    docs-metadata:  # See https://docs.gitlab.com/ee/development/documentation/#metadata
      tags: documentation style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: 'doc/*.md'
      run: scripts/lint-docs-metadata.sh {files}
    docs-trailing_spaces: # Not enforced in CI/CD pipelines, but reduces the amount of required cleanup: https://gitlab.com/gitlab-org/technical-writing/-/blob/main/.gitlab/issue_templates/tw-monthly-tasks.md#remote-tasks
      tags: documentation style
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: 'doc/*.md'
      run: yarn markdownlint:no-trailing-spaces {files}
    docs-deprecations:
      tags: documentation
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: 'data/deprecations/*.yml'
      run: echo "Changes to deprecation files detected. Checking deprecations..\n"; bundle exec rake gitlab:docs:check_deprecations
    docs-removals:
      tags: documentation
      files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
      glob: 'data/removals/*.yml'
      run: echo "Changes to removals files detected. Checking removals..\n"; bundle exec rake gitlab:docs:check_removals

自定义例子,通过定义lefthook.yml配置进行自定义hooks注册。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
巧用 gitHooks 提交前校验代码
在每一个使用 git 进行版本管理的仓库,都有一个目录 .git/hooks,包含 commit 各个阶段 Hooks 的脚本。这些 Hooks 在 git 操作 commit、push、merge 等得时候,可以做前置或者后置的操作,例如 pre-commit 在 git commit 前可以做代码校验,校验代码的时候使用的ESLint,格式化使用的是 prettier。Git 支持的常用钩子见下表,更多请查看官网Hooks:
刘小夕
2021/12/09
4.8K0
巧用 gitHooks 提交前校验代码
复制的官方GitLab 文档
stage: Verify group: Continuous Integration info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments type: reference
拿我格子衫来
2022/01/24
2.4K0
化繁为简的企业级 Git 管理实战(五):二进制大文件的版本控制
二进制大文件的版本控制是 Git 的一个弱项,也是很多团队难免会遇到的一个让人头痛的问题。本文将介绍我们使用 Git 进行二进制文件的版本控制的多种方案,以及相关的踩坑之旅。 毫无疑问,Git 非常适合用于代码文件的版本控制。对于纯代码仓库,由于每次实际提交都是增量内容,即使仓库经历了几十次提交,整个仓库的大小往往都不会大幅增加。 而对于存在二进制文件的仓库,情况就变了:Git 并不能很好地支持二进制文件的增量提交,每次更新一个二进制文件,就相当于把这份文件的完整内容再往仓库里扔。久而久之,这个仓库就会变得
HaHack
2018/07/03
1.9K0
Gitlab CI/CD 实践五:基础镜像 Dcokerfile 仓库 CI 流水线配置
基础镜像Dcokerfile集中管理 优点 结合Gitlab CI,可以快速便捷地新建和更新镜像。 可以快速找到镜像对应的 Dockerfile,明确镜像的具体组成,避免重复造轮子。 基于Dockerfile,方便对镜像进行扩展。 如何使用 创建、修改Dockerfile文件,提交到仓库,就会触发 Gitlab 流水线,自动构建镜像并上传到Harbor。 此仓库单分支管理,可直接在main分支上提交。 项目结构,拿golang基础镜像举例:common/golang/1.17.9/Dockerfile。
Yuyy
2022/09/21
1.1K0
如何优雅的玩转 Git
Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方式。 从概念上来说,其它大部分系统以文件变更列表的方式存储信息,而 Git 是把数据看作是对小型文件系统的一系列快照。
硬件开源小站
2023/04/07
1.5K0
如何优雅的玩转 Git
Git Cheat 2
整理一下经常忘记的Git命令 (版本v2) http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html?utm_source=tool.lu
happy123.me
2018/06/04
5190
Git钩子工具lefthook
lefthook是由 Go 语言开发的适用于多种编程语言项目的快速且强大的 Git 钩子管理器,它可以在项目构建过程中执行一些任务,例如检查代码格式、检查依赖、测试、覆盖率检查、静态分析、持续集成等。官方介绍它的几个特点: 快速,它是用 Go 编写的,可以并行运行命令。 强大,它可以控制执行通过命令传递的执行和文件。 简单,它是一个无依赖的二进制文件,可以在任何环境中工作。
kongxx
2024/05/21
2430
Git 中文参考(五)
给定一个或多个现有提交,还原相关修补程序引入的更改,并记录一些记录它们的新提交。这需要您的工作树是干净的(没有 HEAD 提交的修改)。
ApacheCN_飞龙
2024/06/26
2390
Git入门学习到进阶3
但是在GitHub上,利用Git极其强大的克隆和分支功能,广大人民群众真正可以第一次自由参与各种开源项目了。
全栈工程师修炼指南
2022/09/28
4930
Git入门学习到进阶3
Git详解及 github与gitlab使用
惨绿少年
2017/12/27
3.2K1
Git详解及 github与gitlab使用
git必知必会
暂存区(stage / index): 保存了下次将提交的文件列表信息, 一般存放在 .git目录下 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
互联网金融打杂
2019/05/23
9750
用commander做一个自己的eslint脚手架
如今前端工程化,自动化已经成为了新趋势,如果我们要重新开始做一个项目,你会花费多久的时间在前期环境的搭建上呢?在我们前端的的积累中,我们需要将这些技术沉淀下来,便于我们开始一个新的项目,而不必花费过多的经历在环境搭建中。
2014v
2019/11/20
9200
php如何添加php-psr2语法规范检测
以下以php的laravel框架为主,通过git的pre-commit钩子(hooks)来实现php语法规范检测。
conanma
2021/12/05
9230
Git 中文参考(三)
使用git mergetool运行多个合并实用程序之一来解决合并冲突。它通常在 git merge 之后运行。
ApacheCN_飞龙
2024/06/26
2080
GitLab CI / CD管道配置参考 .gitlab-ci.yml文件定义字段
使用在每个项目中调用的YAML文件配置GitLab CI / CD 管道.gitlab-ci.yml。
拿我格子衫来
2022/01/24
22.3K0
使用Git与GitHub协同开发并搭建私有GitLab代码托管服务器
Linus在1991年创建了开源的Linux,从此全世界的工程师参与了Linux的开发,期初Linus是通过手动diff的方式进行代码审核和合并的,后来BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!如果当时BitMover公司专门为Linux发布一个社区版,也许这家公司也就名垂青史了,可是当时这家公司思想境界没那么高而且Linus也那么牛!
星哥玩云
2022/07/24
1.5K0
使用Git与GitHub协同开发并搭建私有GitLab代码托管服务器
Git中文命令[参数]大全
设置和配置 git config help 获取和创建项目 init clone 基本快照 add status diff commit reset rm mv 分支和合并 branch checkout merge mergetool log stash tag worktree 共享和更新项目 fetch pull push remote submodule 检查和比较 show log diff shortlog describe 修补 apply cherry-pick diff rebase revert 调试 bisect blame grep
cuijianzhe
2024/02/03
3240
如何让你的lint检查更加高效?
导语:在自定义lint规则的实践过程中,我们发现lint扫描的效率非常低,比如在项目中进行一次lint全量扫描,平均需要5分钟左右,而且这是在仅扫描自定义规则的情况下。我们将lint扫描集成到了流水线中,所有的MR操作都会触发扫描,并block住MR的流程。经常会发现这样一种情况,某个MR仅仅修改了一行代码,却仍要扫瞄整个项目,这会严重影响MR的效率。所以,大部分情况下并不需要进行lint的全量扫描,我们更关心的是新增代码是否存在问题。于是,我们需要探索一种lint增量扫描的解决方案。 前言 先来说说
腾讯技术工程官方号
2019/08/19
3.5K2
如何让你的lint检查更加高效?
Git 中文参考(四)
稍微冗长一点,并在名字后显示远程网址。注意:必须放在remote和subcommand之间。
ApacheCN_飞龙
2024/06/26
2270
学习git常用及高阶命令
几个常用的git命令情景 复制代码仓库 git clone --bare|--mirror|--non-bare /var/www/html/myrepo.git 后悔药 覆盖最后一次修改 git add . git commit --amend git push origin master -f Git 放弃本地修改 git checkout . && git clean -df Git 销毁最后一次提交 git reset --hard HEAD^ git push -f origin HEAD^:ma
卡少
2018/05/16
8220
相关推荐
巧用 gitHooks 提交前校验代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文