预提交钩子以检查 Django 迁移

Joh*_*etz 5 django pre-commit pre-commit-hook pre-commit.com

我正在尝试为我的 Django 项目编写一个预提交钩子,以检查丢失的迁移。也就是说,它确保所有更改都反映在迁移文件中。

实现此目的的一种方法是,如果makemigrations命令未返回任何更改,则 PASS 预提交挂钩。

$ ./manage.py makemigrations --dry-run
No changes detected
Run Code Online (Sandbox Code Playgroud)

如果 pre-commit 钩子返回一些东西,则它会失败:

$ ./manage.py makemigrations --dry-run
Migrations for 'myapp':
  myapp/migrations/0003_auto_20201213_2233.py
    - Alter field type on event
Run Code Online (Sandbox Code Playgroud)

我该如何编写这个预提交钩子?有没有比使用更好的方法makemigrations?这是我到目前为止所拥有的,但它总是通过(我想我需要解析响应):

repos:
  - repo: local
    hooks:
      - id: pre-commit-django-migrations
        name: Check django migrations
        entry: ./manage.py makemigrations --dry-run
        language: system
        types: [python]
        pass_filenames: false
Run Code Online (Sandbox Code Playgroud)

ikl*_*nac 5

来自 Djangomakemigrations 文档

--check
Run Code Online (Sandbox Code Playgroud)

当检测到没有迁移的模型更改时,使 makemigrations 以非零状态退出。

所以,你可以使用--check,而不是

  entry: python manage.py makemigrations --check
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,应该添加“--no-input”作为选项,以避免 Django 尝试提示交互式输入。 (3认同)