预提交pre-commit

使用预提交 git 钩子来确保在提交之前进行检查。 ## Intuition 在对本地存储库执行提交之前,心理待办事项列表上有很多项目,从样式、格式化、测试等。很容易忘记其中的一些步骤,尤其是当想要“推送到快速解决”。为了帮助管理所有这些重要步骤,可以使用预提交钩子,当尝试执行提交时,它会自动触发。 > 尽管可以直接在 CI/CD 管道中添加这些检查(例如通过 GitHub 操作),但在推送到远程主机之前验证提交并等待查看需要修复的内容再提交另一个 PR 之前要快得多。 ## 安装 将使用[Pre-commit](https://pre-commit.com/)框架来帮助在提交时通过钩子自动执行重要检查。 ``` # Install pre-commit pip install pre-commit==2.19.0 pre-commit install ``` 将把它添加到`setup.py`脚本而不是`requirements.txt`文件中,因为它不是机器学习操作的核心。 ``` # setup.py setup( ... extras_require={ "dev": docs_packages + style_packages + test_packages + ["pre-commit==2.19.0"], "docs": docs_packages, "test": test_packages, }, ) ``` ## 配置 `.pre-commit-config.yaml`通过配置文件定义预提交钩子。可以从头开始创建 yaml 配置,也可以使用预提交 CLI 创建可以添加的示例配置。 ``` # Simple config pre-commit sample-config > .pre-commit-config.yaml cat .pre-commit-config.yaml ``` ``` # 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: v3.2.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - id: check-added-large-files ``` ## Hooks 在创建和使用钩子时,有几个选项可供选择。 ### 内置 在示例配置中,可以看到 pre-commit 从它的存储库中添加了一些默认hook。它指定存储库的位置、版本以及要使用的特定hook ID。可以了解这些钩子的功能,并通过探索 pre-commit 的[内置](https://github.com/pre-commit/pre-commit-hooks)钩子来添加更多内容。其中许多还有其他参数,可以配置这些参数来自定义钩子。 ``` # Inside .pre-commit-config.yaml ... - id: check-added-large-files args: ['--maxkb=1000'] exclude: "notebooks/tagifai.ipynb" ... ``` > 一定要探索许多其他[内置的钩子](https://github.com/pre-commit/pre-commit-hooks),因为在项目中使用了一些非常有用的钩子。例如,`check-merge-conflict`查看是否存在任何挥之不去的合并冲突字符串,或者`detect-aws-credentials`是否不小心将凭据暴露在文件中,等等。 _还可以通过使用可选的排除_键来排除某些文件被钩子处理。可以为每个钩子 ID 配置许多其他[可选键](https://pre-commit.com/#pre-commit-configyaml---hooks)。 ``` # Inside .pre-commit-config.yaml ... - id: check-yaml exclude: "mkdocs.yml" ... ``` ### Custom 除了 pre-commit 的内置钩子,还有许多自定义的、第 3 方[流行的钩子](https://pre-commit.com/hooks.html)可供选择。例如,如果想使用 Black 作为钩子应用格式检查,可以利用 Black 的 pre-commit 钩子。 ``` # Inside .pre-commit-config.yaml ... - repo: https://github.com/psf/black rev: 20.8b1 hooks: - id: black args: [] files: . ... ``` 这个特定的钩子在 Black 存储库中的[.pre-commit-hooks.yaml](https://github.com/psf/black/blob/master/.pre-commit-hooks.yaml)下定义,其他自定义钩子也在其各自的包存储库下。 ### 当地的 也可以创建自己的本地钩子,而无需配置单独的 .pre-commit-hooks.yaml。这里定义了两个 pre-commit 钩子,`test-non-training`并且`clean`,来运行在 Makefile 中定义的一些命令。同样,可以运行任何带有参数的入口命令来非常快速地创建钩子。 ``` # Inside .pre-commit-config.yaml ... - repo: local hooks: - id: test name: test entry: make args: ["test"] language: system pass_filenames: false - id: clean name: clean entry: make args: ["clean"] language: system pass_filenames: false ``` > 查看完整`.pre-commit-config.yaml` ``` # 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: v4.3.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer exclude: "config/run_id.txt" - id: check-yaml exclude: "mkdocs.yml" - id: check-added-large-files args: ['--maxkb=1000'] exclude: "notebooks" - id: check-ast - id: check-json - id: check-merge-conflict - id: detect-aws-credentials - id: detect-private-key - repo: https://github.com/psf/black rev: 22.3.0 hooks: - id: black args: [] files: . - repo: https://gitlab.com/PyCQA/flake8 rev: 3.9.2 hooks: - id: flake8 - repo: https://github.com/PyCQA/isort rev: 5.10.1 hooks: - id: isort args: [] files: . - repo: https://github.com/asottile/pyupgrade # update python syntax rev: v2.34.0 hooks: - id: pyupgrade args: [--py36-plus] - repo: local hooks: - id: test name: test entry: make args: ["test"] language: system pass_filenames: false - id: clean name: clean entry: make args: ["clean"] language: system pass_filenames: false ``` ## Commit 当尝试提交时,预提交hook将自动执行。将能够查看每个钩子是否通过或失败并进行任何更改。如果任何hook失败,必须修复相应的文件,或者在许多情况下,会自动重新格式化。 ``` ... detect private key.....................................PASSED black..................................................FAILED ... ``` 如果任何钩子失败,需要一次`add`又一次`commit`地确保所有钩子都通过。 ``` git add . git commit -m ``` ![预提交](https://upload-images.jianshu.io/upload_images/27840083-a31282bc6d01e3c7.png) ## Run 尽管预提交hook是在提交之前(预)运行,但可以手动触发所有或一组文件上的所有或单个hook。 ``` # Run pre-commit run --all-files # run all hooks on all files pre-commit run --all-files # run one hook on all files pre-commit run --files # run all hooks on a file pre-commit run --files # run one hook on a file ``` ## Skip 强烈建议不要跳过运行任何预提交hook,因为它们的存在是有原因的。但是对于一些非常紧急的、拯救世界的提交,可以使用 no-verify 标志。 ``` # Commit without hooks git commit -m --no-verify ``` > 强烈建议**不**要这样做,因为无论您的更改有多“小”,都不应强制推动任何提交。如果您不小心这样做并想清除缓存,`pre-commit run --all-files`请再次运行并执行提交消息操作。 ## 更新 在`.pre-commit-config.yaml`配置文件中,必须为每个存储库指定版本,以便可以使用它们最新的hook。预提交有一个自动更新 CLI 命令,它将在这些版本可用时更新它们。 ``` # Autoupdate pre-commit autoupdate ``` 还可以将此命令添加到`Makefile`创建开发环境时执行的命令,以便一切都是最新的。 ``` # Makefile .ONESHELL: venv: python3 -m venv venv source venv/bin/activate && \ python3 -m pip install --upgrade pip setuptools wheel && \ python3 -m pip install -e ".[dev]" && \ pre-commit install && \ pre-commit autoupdate ``` ___ 更多干货,第一时间更新在以下微信公众号: ![](https://raw.githubusercontent.com/franztao/blog_picture/main/marktext/2022-12-03-12-49-27-weixin.png) 您的一点点支持,是我后续更多的创造和贡献 ![](https://upload-images.jianshu.io/upload_images/27840083-39f5495bf527764c.png) 转载到请包括本文地址 更详细的转载事宜请参考[文章如何转载/引用](https://franztao.github.io/2022/12/04/%E6%96%87%E7%AB%A0%E5%A6%82%E4%BD%95%E8%BD%AC%E8%BD%BD%E5%92%8C%E5%BC%95%E7%94%A8/) 本文主体源自以下链接: ``` @article{madewithml, author = {Goku Mohandas}, title = { Made With ML }, howpublished = {\url{https://madewithml.com/}}, year = {2022} } ``` 本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容