• 预提交和 Git Hooks:自动化高质量代码


    如何使用预提交和 git hooks 提高代码质量

           欢迎来到雲闪世界     什么是预先提交?
    Pre-commit是一个 Python 包,它使创建预提交钩子变得更容易。钩子是 git 的原生功能,是在执行特定 git 命令之前运行的脚本。

    您可以在 repo.git/hooks目录中找到钩子,该目录由 git 自动填充。如果您查看此目录,您将找到如下所示的文件:

    1. applypatch-msg.sample pre-commit.sample prepare-commit-msg.sample
    2. commit-msg.sample pre-merge-commit.sample push-to-checkout.sample
    3. fsmonitor-watchman.sample pre-push.sample update.sample
    4. post-update.sample pre-rebase.sample
    5. pre-applypatch.sample pre-receive.sample

    扩展阻止了这些钩子的执行。要启用这些钩子,请删除该.sample扩展并编辑文件。

    然而,这很繁琐,不太方便用户使用,而且很难通过版本控制进行管理。这就是预提交的作用所在。它为命令创建一个钩子,commit以自动检测代码中的任何问题,并使创建脚本变得无缝。

    它会创建一个配置文件,在调用命令时执行git commit。如果配置文件中的任何检查失败,则提交将被中止。这可确保您的代码库始终保持质量和一致性。
    为什么要进行数据科学?
    您可能想知道,如果您是数据科学家,为什么还需要学习 git hooks。好吧,社区内部发生了变化,精通软件工程变得越来越重要,能够将自己的模型部署到生产中非常有价值。确保机器学习模型的稳健部署并保持良好代码质量的一种技术是使用 git hooks 和预提交。机器学习模型非常复杂,因此,在模型投入生产之前,您可以采取任何措施来自动化工作流程并捕获潜在错误,这是理想的做法。
    用法
    安装
    安装 pre-commit 非常简单,与使用 pip 安装任何其他 Python 库相同。我个人使用Poetry,但它们都可以正常工作。

    1. pip install pre-commit # pip 
    2. poetry add pre-commit # I personally use poetry

    您可以通过运行来确认其已安装。

    pre-commit --version

    配置文件
    导航到您的存储库的根目录

    touch .pre-commit-config.yaml 

    在您的项目中创建一个。您可以通过运行以下命令来执行此操作:

    触摸.预提交配置.yaml
    此文件将定义您在提交代码之前要运行的内容。示例如下:

    1. repos:
    2. - repo: https://github.com/pre-commit/pre-commit-hooks
    3. rev: v2.3.0
    4. hooks:
    5. - id: check-yaml
    6. - id: end-of-file-fixer
    7. - id: trailing-whitespace
    8. - repo: https://github.com/psf/black
    9. rev: 22.10.0
    10. hooks:
    11. - id: black
    12. - repo: https://github.com/PyCQA/flake8
    13. rev: v6.0.0
    14. hooks:
    15. - id: flake8
    16. additional_dependencies: [flake8-docstrings, flake8-import-order]
    17. args: ['--max-line-length=88']

    这里发生的事情是,repos指示包含我们想要运行的钩子的存储库列表。第一个是pre-commit-hooks包含钩子的存储库:

    id: check-yaml
    id: end-of-file-fixer
    id: trailing-whitespace
    在这种情况下,id是您想要从 repo 运行的精确预提交钩子的特定且唯一的标识符

    black然后,我们对和包执行相同的流程flake8。
    执行
    定义文件后,您需要运行pre-commit install以让预提交知道您想要使用指定的脚本对此 repo 使用预提交。

    然后,更改代码并尝试提交代码。您应该看到预提交钩子正在工作。

    您还可以通过运行以下命令查看预提交正在执行的操作pre-commit run --all-files。

    如果您想在不运行钩子的情况下提交代码,您可以使用git commit --no-verify它来绕过它。

    好啦,现在我们来看一个例子吧!

    例子
    我已经在我的Medium-Articles仓库中安装了 pre-commit ,我们将用它来展示一个示例。

    在我的 repo 中,我有以下 Makefile。

    1. SHELL=/bin/bash
    2. PHONY: install
    3. install:
    4. poetry install
    5. PHONY: lint
    6. lint:
    7. poetry run black .
    8. poetry run isort .

    我的两个命令是install和lint设置我的环境并确保我的代码看起来不错。
    我.pre-commit-config.yaml看起来像这样,与我之前展示的模板略有不同。

    1. repos:
    2. - repo: local
    3. hooks:
    4. - id: lint
    5. name: lint
    6. entry: make lint
    7. language: python
    8. types: [python]
    9. stages: [commit]


    在这种情况下,钩子所在的存储库是本地的,即在我的项目中。此钩子将使用该entry命令,并将该命令作为钩子的一部分执行make lint,该命令在 make 文件中定义。我的一个文件如下所示(relu.py):

    1. # Import packages
    2. import numpy as np
    3. import os
    4. import plotly.express as px
    5. # relu function
    6. def relu(x):
    7. return np.maximum(0, x)
    8. # Generate data
    9. x = np.linspace(-5, 5, 100)
    10. y = relu(x)
    11. # Graph
    12. fig = px.line(x=x, y=y)
    13. fig.update_layout(template="simple_white", font=dict(size=18), title_text="ReLU", width=650, title_x=0.5, height=400,)
    14. if not os.path.exists("../images"):
    15. os.mkdir("../images")
    16. fig.write_image("../images/relu.png")
    17. fig.show()

    现在让我们尝试提交此代码并看看会发生什么。

    1. (medium-articles-py3.11) egorhowell@Egors-MBP Medium-Articles % git add .
    2. (medium-articles-py3.11) egorhowell@Egors-MBP Medium-Articles % git commit -m "testing pre-commit"
    3. [INFO] Initializing environment for local.
    4. [INFO] Installing environment for local.
    5. [INFO] Once installed this environment will be reused.
    6. [INFO] This may take a few minutes...
    7. lint.....................................................................Failed
    8. - hook id: lint
    9. - files were modified by this hook
    10. poetry run black .
    11. Skipping .ipynb files as Jupyter dependencies are not installed.
    12. You can fix this by running ``pip install "black[jupyter]"``
    13. reformatted /Users/egorhowell/Repos/Medium-Articles/Data Science Basics/relu.py
    14. reformatted /Users/egorhowell/Repos/Medium-Articles/Time Series/Exponential Smoothing/holt_winters.py
    15. All done! ✨ 🍰 ✨
    16. 2 files reformatted, 67 files left unchanged.
    17. poetry run isort .
    18. Fixing /Users/egorhowell/Repos/Medium-Articles/Time Series/Exponential Smoothing/holt_winters.py
    19. Skipped 2 files
    20. make: Nothing to be done for `Data Science Basics/relu.py'.

    钩子失败,因为它重新格式化了relu.py。现在看起来像这样:

    1. # Import packages
    2. import os
    3. import numpy as np
    4. import plotly.express as px
    5. # relu function
    6. def relu(x):
    7. return np.maximum(0, x)
    8. # Generate data
    9. x = np.linspace(-5, 5, 100)
    10. y = relu(x)
    11. # Graph
    12. fig = px.line(x=x, y=y)
    13. fig.update_layout(
    14. template="simple_white",
    15. font=dict(size=18),
    16. title_text="ReLU",
    17. width=650,
    18. title_x=0.5,
    19. height=400,
    20. )
    21. if not os.path.exists("../images"):
    22. os.mkdir("../images")
    23. fig.write_image("../images/relu.png")
    24. fig.show()

    因此,我们的预提交钩子成功运行了!
    总结与思考
    Pre-commit 是一个实用的 Python 包,它可以改善您的 git hook 工作流程并简化您的脚本。它旨在通过自动化代码检查过程来保持软件的高质量并消除错误风险。作为数据科学家,我们越来越多地参与模型部署,使用 git hooks 和 pre-commit 等技术来确保我们的模型安全投入生产。

    感谢关注[](雲闪世界)。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)
     订阅频道(https://t.me/awsgoogvps_Host)
     TG交流群(t.me/awsgoogvpsHost)

  • 相关阅读:
    ETCD基本原理
    CH08_搬迁特性
    Python3中用户注册小案例 - 解决中文字符问题 (代码)
    图像处理基础知识
    <C++>详解vector类
    【FFMPEG】Windows下将ffmpeg编译成lib和dll完整教程
    计算机毕业设计Java球馆预约管理系统(源代码+数据库+系统+lw文档)
    13.8 - 软件测试工作量及成本估算 3.9 - 软件测试成本估算示例
    zookeeper源码(08)请求处理及数据读写流程
    [Java]_[初级]_[使用fastjson以流的方式读取json大文件]
  • 原文地址:https://blog.csdn.net/2401_85233349/article/details/141088944