项目管理:代码检查 pre-commit 使用详解

2023-05-16

Git钩子脚本对于在提交代码审查之前识别简单问题很有用。我们在每次提交时都运行钩子,以自动指出代码中的问题,例如缺少分号,尾随空白和调试语句。通过在代码审阅之前指出这些问题,代码审阅者可以专注于更改的体系结构,而不会浪费琐碎的样式问题。

我们建立了预提交来解决钩子问题。它是用于预提交挂钩的多语言包管理器。您可以指定所需的挂钩列表,并且在每次提交之前,预提交可以管理用任何语言编写的任何挂钩的安装和执行。 pre-commit是专门为不需要root访问而设计的。如果您的开发人员之一未安装节点,但修改了JavaScript文件,则预提交会自动处理下载和构建节点,以在没有root的情况下运行eslint。
在此介绍的pre-commit只是git hook的一部分, git hook分客户端和服务端的,pre-commit属于客户端的。

下面我将以我在linux 下安装pre-commit 检查python代码为例子讲解 。官网:https://pre-commit.com/

1: 安装

Using pip:

pip install pre-commit
如果你的项目中有requirements.txt, 把pre-commit加入到里面。

然后命令行输入查看是否安装成功:

$ pre-commit --version
pre-commit 2.1.1

配置

我们需要添加个pre-commit的配置文件,在git项目的根目录创建一个.pre-commit-config.yaml 文件

下面是我设置python 检查的一个文件举例:

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v2.4.0
    hooks:
    -   id: check-xml
    -   id: check-added-large-files
    -   id: check-byte-order-marker
-   repo: https://gitlab.com/pycqa/flake8
    rev: '3.7.9'
    hooks:
    -   id: flake8
-   repo: https://github.com/codespell-project/codespell
    rev: v1.16.0
    hooks:
    -   id: codespell

在命令行执行下面命令:

$ pre-commit install
pre-commit installed at .git/hooks/pre-commit

我们就把pre-commit安装到了项目.git的hook目录下面,我们在执行git commit 的时候就会先调用这个文件,当然还可以在git操作的很多步骤前面做一些工作,pre-merge pre-update…

$ ls .git/hooks/
applypatch-msg.sample      post-update.sample         pre-commit.sample          pre-push.sample            update.sample
commit-msg.sample          pre-applypatch.sample      pre-merge-commit.sample    pre-rebase.sample
fsmonitor-watchman.sample  pre-commit                 prepare-commit-msg.sample  pre-receive.sample

然后我们来看下这个pre-commit文件

$ cat .git/hooks/pre-commit
#!/usr/bin/env python.exe
# File generated by pre-commit: https://pre-commit.com
# ID: 138fd403232d2ddd5efb44317e38bf03
import os
import sys

# we try our best, but the shebang of this script is difficult to determine:
# - macos doesn't ship with python3
# - windows executables are almost always `python.exe`
# therefore we continue to support python2 for this small script
if sys.version_info < (3, 3):
    from distutils.spawn import find_executable as which
else:
    from shutil import which

# work around https://github.com/Homebrew/homebrew-core/issues/30445
os.environ.pop('__PYVENV_LAUNCHER__', None)

# start templated
INSTALL_PYTHON = 'c:\\users\\wuh17\\appdata\\local\\programs\\python\\python37-32\\python.exe'
ARGS = ['hook-impl', '--config=.pre-commit-config.yaml', '--hook-type=pre-commit']
# end templated
ARGS.extend(('--hook-dir', os.path.realpath(os.path.dirname(__file__))))
ARGS.append('--')
ARGS.extend(sys.argv[1:])

DNE = '`pre-commit` not found.  Did you forget to activate your virtualenv?'
if os.access(INSTALL_PYTHON, os.X_OK):
    CMD = [INSTALL_PYTHON, '-mpre_commit']
elif which('pre-commit'):
    CMD = ['pre-commit']
else:
    raise SystemExit(DNE)

CMD.extend(ARGS)
if sys.platform == 'win32':  # https://bugs.python.org/issue19124
    import subprocess

    if sys.version_info < (3, 7):  # https://bugs.python.org/issue25942
        raise SystemExit(subprocess.Popen(CMD).wait())
    else:
        raise SystemExit(subprocess.call(CMD))
else:
    os.execvp(CMD[0], CMD)

通过pdb 调试这个文件我们可以看到

(Pdb) p CMD
['c:\\users\\wuh17\\appdata\\local\\programs\\python\\python37-32\\python.exe', '-mpre_commit', 'hook-impl', '--config=.pre-commit-config.yaml', '--hook-type=pre-commit', '--hook-dir', 'C:\\Users\\wuh17\\Documents\\pythontest\\.git\\hooks', '--']

命令执行的全部参数,开始我们创建的.pre-commit-config.yaml 文件就会被传递进去。

执行

安装配置好后,最好做个全文的检查,修复问题。

$ pre-commit run --all-files
[INFO] Initializing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Initializing environment for https://github.com/psf/black.
[INFO] Installing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
[INFO] Installing environment for https://github.com/psf/black.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
Check Yaml...............................................................Passed
Fix End of Files.........................................................Passed
Trim Trailing Whitespace.................................................Failed
- hook id: trailing-whitespace
- exit code: 1

Files were modified by this hook. Additional output:

Fixing sample.py

black....................................................................Passed

当然我们在做git commit的时候只会对我我们git add的文件进行检查。

其他用途

还可以不再git commit 的时候做检查,可以单独检查某个文件,检查某次commit的提交等等用法。

$ pre-commit run --help
usage: pre-commit run [-h] [--color {auto,always,never}] [-c CONFIG]
                      [--verbose] [--origin ORIGIN] [--source SOURCE]
                      [--commit-msg-filename COMMIT_MSG_FILENAME]
                      [--remote-name REMOTE_NAME] [--remote-url REMOTE_URL]
                      [--hook-stage {commit,merge-commit,prepare-commit-msg,commit-msg,manual,push}]
                      [--show-diff-on-failure]
                      [--all-files | --files [FILES [FILES ...]]]
                      [hook]

positional arguments:
  hook                  A single hook-id to run

optional arguments:
  -h, --help            show this help message and exit
  --color {auto,always,never}
                        Whether to use color in output. Defaults to `auto`.
  -c CONFIG, --config CONFIG
                        Path to alternate config file
  --verbose, -v
  --origin ORIGIN, -o ORIGIN
                        The origin branch's commit_id when using `git push`.
  --source SOURCE, -s SOURCE
                        The remote branch's commit_id when using `git push`.
  --commit-msg-filename COMMIT_MSG_FILENAME
                        Filename to check when running during `commit-msg`
  --remote-name REMOTE_NAME
                        Remote name used by `git push`.
  --remote-url REMOTE_URL
                        Remote url used by `git push`.
  --hook-stage {commit,merge-commit,prepare-commit-msg,commit-msg,manual,push}
                        The stage during which the hook is fired. One of
                        commit, merge-commit, prepare-commit-msg, commit-msg,
                        manual, push
  --show-diff-on-failure
                        When hooks fail, run `git diff` directly afterward.
  --all-files, -a       Run on all the files in the repo.
  --files [FILES [FILES ...]]
                        Specific filenames to run hooks on.

总结

pre-commit 变化比较多的在于用户的需求,根据需求进行配置文件的修改,例如修改行的长度值:

-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v1.2.3
    hooks:
    -   id: flake8
        args: [--max-line-length=131]

欢迎关注交流学习,to be better

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

项目管理:代码检查 pre-commit 使用详解 的相关文章

  • 【项目管理】redmine

    Redmine是用Ruby开发的基于web的项目管理软件 是用ROR框架开发的一套跨平台项目管理系统 据说是源于Basecamp的ror版而来 支持多种数据库 有不少自己独特的功能 例如提供wiki 新闻台等 还可以集成其他版本管理系统和B
  • sql事务不回滚

    在transact sql中 在 开始事务 和 提交事务 之间封装不同操作的目的是什么 我注意到 当函数中间抛出异常时 它不会回滚事务 如果发生错误 如何回滚事务 使用 try 和 catch 进行正确错误处理的最佳方法 然后根据错误在 c
  • Xcode 项目中的“UserInterfaceState.xcuserstate”文件是什么?

    我用的是svnX 导入项目时 我选中 不忽略 选项 用于导入 libOAuth a 但一个文件引起了一个小问题 用户界面状态 xcuserstate 这个文件是什么 我可以忽略这个文件吗 是不是重要 我应该提交这个文件吗 这个文件是什么 您
  • Bitbucket REST接口和GIT;如何从分支获取两个标签之间的日志历史记录

    我正在构建一个应用程序 它需要 git 对远程源上的分支提交的所有提交注释 我们的存储库托管在 BitBucket 服务器上 是一个 Git 存储库 我查看了 Bitbucket Stash REST api 我可以通过浏览提交来带回 gi
  • 如何合并单个提交?

    有时我同时与多个分支机构合作 假设我有名为 master release 1 1 和 Experimental 的分支 我创建一个新文件或在实验中进行更改 并且我希望将一项更改应用于其他分支 我可以在 git 中执行此操作吗 如果我只是将提
  • 如何使用 CSS 使另一个标签的行为与 pre 标签完全相同?

    I want code 标签的行为类似于 pre 标签 但问题是我在块的开头出现换行符 我如何摆脱该换行符 这表明了我的意思 http jsfiddle net 6NmPN http jsfiddle net 6NmPN 这似乎是一个浏览器
  • 如何提交不更改和新消息?

    我怎样才能制作一个新的commit如果没有对文件进行任何更改 则创建一条新消息 这是不可能的 因为提交的代码 SHA 将是相同的 很少有充分的理由这样做 但参数是 allow empty对于空提交 没有更改文件 与 allow empty
  • GitHub 源代码视图显示不再存在的提交

    两周前我重写了 GitHub 存储库的历史 rebase 和一些精选 并通过强制将其推回 GitHub git push f origin master 一切都很顺利 至少看起来是这样git log显示了正确的提交历史记录 我知道 重写历史
  • 如何保留 HTML
     标记中包含的文本的空白缩进,不包括文档中 
     标记的当前缩进级别?				
    			

    我正在尝试在网站上显示我的代码 但在正确保留空格缩进方面遇到问题 例如给出以下代码片段 Here is my code pre def some funtion return Hello World end pre 这在浏览器中显示为 He
  • Git:将提交合并到不同的分支中

    所以我有3个分支 develop 我的持续开发分支 version 1 一个发布分支 version 2 一个发布分支 我必须做一个修补程序version 2要重新发布该版本 需要在 2 个文件中进行 2 行更改 非常小 我想将该修复应用于
  • git 可以提交新的非空文件的“空版本”吗?

    git 可以提交某些文件的空版本吗 恰当的例子是 我需要首先添加新的 未跟踪的 非空文件并提交为empty文件 以便将其内容标记为新内容并进行审查 完整的 未跟踪的文件应not被添加到索引中 git diff应通过将文件与其提交的空版本进行
  • 如何在 Xcode 8 上恢复之前的提交?

    假设我有 5 个本地提交 commit 1 commit 2 commit 3 commit 4 commit 5 当我工作的时候 我想回去提交2 我该怎么做呢 在以前版本的 Xcode 中使用快照非常容易 放弃更改 只会返回到提交 5 对
  • 将 postgreSQL 存储过程作为一个事务执行

    我正在使用 PostgreSQL 9 3 并且创建了一些包含多个语句的存储过程 我在准备好的语句的帮助下在 Java 应用程序中调用此存储过程 现在我读到存储过程中的每个语句都作为一个事务执行 即每个语句后一次提交 但我想要的是将整个存储过
  • Git Rebase 期间的 Git Commit - 到底发生了什么?

    我正在寻找一个很好的描述 说明如果在变基期间提交会发生什么 以及如何以一种简单的方式 恢复 这一情况 让我们考虑一个场景 其中一个大型提交被重新设定 在变基期间出现冲突 用户开始合并更改 现在 想象一下这样一个场景 你快完成了 但你没有打电
  • 存储过程事务

    我以前从未使用过事务 提交和回滚 现在我需要使用一个 我已经在网上检查了一些示例 以确保我实际上正确使用了它 但我仍然不确定我的编码是否正确 我希望有人能够审查并建议我这是否正确 基本上我有两个数据库用于一个应用程序 一种是存档 意味着不再
  • 我应该进行外观改变吗?

    我经常想将一些小的编码风格更改提交到源代码管理 但现在更改日志充满了那些不影响代码功能的更改 下次我必须修复一些小问题时该怎么办 例如 删除和排序 using 在 NET 中 在 Python 中导入 在 C 中包含 正确的缩进 间距和换行
  • git log 不显示提交,但 git log 显示编辑文件的提交

    我在寻找丢失的零钱时发现了这个奇怪的问题 我输入 git log httpd conf 我按照预期得到了一堆提交哈希 但不是我所做的 当我输入 git log 我看到了我所做的承诺 当我跑步时 git show
  • 为什么即使 use_transactional_fixtures = false after_commit 也没有运行

    rspec 中的事务装置会阻止调用 after commit 但即使我使用以下命令禁用它们 RSpec configure do config config use transactional fixtures false end The
  • commit失败是否需要回滚?

    这似乎是一个足够简单的问题 但我找不到任何特定于 MySQL 的明确答案 看这个 mysqli gt autocommit false Start the transaction success true do a bunch of ins
  • Subversion:暂存文件以显式提交?

    我已经非常习惯 git 的方式 即必须接触要提交的每个文件 并且在执行此操作时仔细检查差异 现在在工作中我必须使用 svn 并且我总是不小心提交一些东西 有没有办法让 subversion 的行为像 git 一样 因为我必须明确告诉每个文件

随机推荐

  • OpenStack之Nova(T版)

    目录 一 概述二 Nova系统架构一 API二 Scheduler一 选择计算节点二 调度器类型三 过滤器 三 compute四 conductor五 PlacementAPl六 cell架构 三 部署一 Placement一 创建数据库二
  • 基于FreeRTOS消息缓冲区,实现STM32H7双核之间通信的原理

    FreeRTOS V10 3 1版本已发布 xff0c 官方网站也更新了 xff08 大家可以去看看 xff09 今天给大家分享的是 xff1a 使用FreeRTOS消息缓冲区 xff0c 实现简单的非对称多处理 xff08 AMP xff
  • keil mdk中文乱码,两种解决方法,字体不再难看

    方法一 xff1a 修改成Encode in UTF 8 without signature 我嘞个去 xff01 被字符编码整晕了 xff0c unicode xff0c ANSI xff0c UTF 8 xff0c GB2312 新版m
  • 迪文屏幕T5L平台学习笔记三:定时器使用

    上篇博客介绍了第一个C51程序Demo xff0c 在文本上显示一个 xff08 中英文混合 xff09 字符串 xff0c 这篇博客介绍下定时器2的使用 xff08 定时器0和1类似 xff09 一 先看定时器2的寄存器 在其他章节 xf
  • 使用闲置主机共享资源赚钱教程,收益不知道多少,不知道够不够电费的

    下载网心云的镜像ISO文件 xff0c 使用Rufus将镜像烧到一个U盘中 注意 此操作会清空U盘 xff0c 做完镜像后用U盘启动系统进入安装模式 安装完开机激活就可以了 瞧瞧我的收益 xff0c 1TB硬盘4核2G的工业主机 xff0c
  • 迪文屏幕T5L平台学习笔记七:RS485测试

    由于串口通信距离近 xff0c 且容易受到干扰 xff0c 最近改为RS485通信方案 xff0c 迪文屏幕DMG10600K070 03WTC正好也支持RS485通信 xff0c 把调试过程记录下 1 首先看下数据手册 xff1a 串口5
  • 烧录flash_烧录固件完成后,配置JFLASH让程序自动运行

    问题描述 xff1a 当使用IAR调试Cortex M0 43 产品 xff0c 在IAR MDK调试环境下烧录以后可以正常运行 xff0c 但是如果使用Segger的JFLASH直接烧录固件 bin或者 hex格式二进制文件 后程序并没有
  • 电力网络安全区域概念及划分

    笔者的专栏有很多人询问电力网络安全区的内容 xff0c 加上笔者多年来也一直看得很混乱 xff0c 这次多方收集信息 xff0c 加上自己的理解 xff0c 写成此文 内容可能更符合电网网络结构 xff0c 如有疏漏欢迎到电力知识图谱网站
  • 一文了解DTU、FTU、TTU、RTU的区别

    电力自动化有一堆 某TU xff08 不敢写X 怕被认为新设备 xff09 的设备 xff0c 搞得不做自动化的同学们很晕 xff0c 这里为大家收集下这几者的定义和区别 想要了解更加详细的内容 xff0c 可以点击电力知识图谱网站 xff
  • PIC单片机的配置字总结

    平台为 xff1a MPLAB V8 92 xff0c 这个ID有两个编译选项 xff1a DEBUG和RELEASE xff0c 那么可以根据系统预定宏来自动根据选择模式 xff0c 配置配置字 一 PIC18F系列配置字编写 MUC P
  • USB 2.0 A型、B型、Mini和Micro接口 type-c 定义及封装

    免责声明 xff1a 所有资料均来自互联网 xff0c 如有错误之处 xff0c 本人概不负责 出处 xff1a http blog 163 com wilicedon lee blog static 8158848320101174142
  • 对于嵌入式初学者建议读的书

    刚加入了几个嵌入式群 xff0c 群里提问最多的是怎么能够快速入门 xff1f 对于这个问题 xff0c 一千人个人可能有一千个答案 我也在嵌入式行业里混了几年 xff0c 虽然说技术很水 xff0c 经 验不多 xff0c 但是比起没有入
  • matlab学习笔记二:plot画图怎么设置线条类型和颜色

    出处 xff1a https jingyan baidu com article 48b558e338aaa37f38c09a80 html matlab的绘图功能很强大 xff0c 因此它在科学实验和社会调研中被广泛应用 我们在 绘制图形
  • XModem协议

    出处 xff1a XModem协议 XModem协议介绍 xff1a XModem是一种在串口通信中广泛使用的异步文件传输协议 xff0c 分为XModem和1k XModem协议两种 xff0c 前者使用128字节的数据块 xff0c 后
  • 详解,N沟道MOS管和P沟道MOS管

    出处 xff1a P沟道mos管作为开关的条件 xff08 GS gt GS xff08 TH xff09 xff09 1 P沟道mos管作为开关 xff0c 栅源的阀值为 0 4V xff0c 当栅源的电压差为 0 4V就会使DS导通 x
  • python通过pip安装torch错误及解决办法ERROR: Could not find a version that satisfies the requirement torch

    错误代码 pip install torch 61 61 1 6 0 43 cu101 to rchvision 61 61 0 7 0 43 cu101 f https download pytorch org whl torch sta
  • 智能代码补全工具 tabnine

    安装方法链接 xff1a https www tabnine com install 亲测有效 xff1a tabnine vim Without Vundle Run git clone depth 1 https github com
  • ovsdb <7> OVSDB操作实践及各种机制的分析

    4 2OVSDB操作实践及各种机制的分析 在安装了上述的openvswitch和做了相应的配置之后 xff0c 下面对openvswitch中提供的各种ovsdb的工具 操作方式和工作机制做一些简单的说明 xff1a 1 Ovsdb ser
  • ovsdb <10> Ops-cli结合ovsdb部分流程及接口分析

    4 6Ops cli结合ovsdb部分流程及接口分析 Ops中对于ovsdb的应用主要是基于上述的ovsdb的简单用法上的一个扩展和函数封装 xff0c 现在就其与之前不同的地方做补充说明并就各个函数的使用做相应的说明 根据前面的ovsdb
  • 项目管理:代码检查 pre-commit 使用详解

    Git钩子脚本对于在提交代码审查之前识别简单问题很有用 我们在每次提交时都运行钩子 xff0c 以自动指出代码中的问题 xff0c 例如缺少分号 xff0c 尾随空白和调试语句 通过在代码审阅之前指出这些问题 xff0c 代码审阅者可以专注