Skip to content

pre-commit

pre-commit的自动修复流程

1. 如果发现未staged的内容会自动git stash暂存(在pre-commit运行初识只进行一次全局stash)
2. 运行自动修复
3. git stash pop 拿出暂存的环节
4. 发现与修改后内容有差异,rolling back fixes
# 这个问题出现,是因为pre-commit自动修复的部分,不会自动git add,运行一次pre-commit完成自动修改,再次运行pre-commit此时文件内容是修复后的与之前git add的未修复内容出现冲突,所以会自动git stash修复内容,仓库内容再次成为git add之后的未修复内容,再次发生pre-commit自动修复?但此时自动修复后的内容不就是跟git stash的内容一样么?(这个暂时没解决)
# 想要查看哪些内容修改: git status ;  git diff

pre-commit Best Practice

为避免上述问题,pre-commit的best practice不是等git commit被动调动,而是pre-commit run --all-files(从.git根目录开始recursively check all files)

.pre-commit-config.yaml定义pre-commit的行为

pre-commit sample-config > .pre-commit-config.yaml

生成模板配置文件

pre-commit install

用于在本地仓库中安装Git hooks,会在.git/hooks/目录下创建一个名为pre-commit的hook script,这个脚本会在每次git commit时候触发,执行.pre-commit-config.yaml中定义的检查。 没有配置文件也可以install,但git commit时候不触发任何检查,并提醒没有配置文件。

pre-commit配置文件修改后并不需要更新.git/hooks/pre-commit文件

后者只是一个触发器,会基于配置文件的内容执行

配合flake8

pre-commit会默认从运行命令的当前文件夹里寻找.flake8文件; 如果根目录和submodule都需要,可以通过args: [--config=absoluate_path/.flake8]

配合ruff

pre-commit-config中的args定义是传递给pre-commit使用,是pre-commit的工作流程,不是ruff的配置; 而pyproject.toml中ruff的配置,是配置ruff的运行规则;

Error

[WARNING] Unstaged files detected.

pre-commit执行工作流

  • pre-commit在本地执行 执行的工作本质也可以放在github action这样的云端
  • pre-commit为每个hooks创建虚拟环境 不使用工作目录环境里的配置,而是自己重新创建,放在~/.cache/pre-commit/中;
  • pre-commit默认只检staged files(git add 的)
  • pre-commit会在运行的当前目录下寻找 如果要在子目录,比如submodule中使用pre-commit,需要显式指定配置文件--config;

同一个项目里不同submodule里的pre-commit可能会冲突,导致initializing卡住

通过将.pre-commit-config.yaml放置在项目根目录下面,在submoudle中install然后指定--config文件使用pre-commit run,在对应hooks中修改--config参数指定配置文件。

评论