a template repo for c++/python/doc by irasin
- 通过python的
pip
安装
pip install pre-commit
pip install clang-format ## 安装clang-format,因为我通常是会用到c++开发,可以用clang-format来格式化代码
pip install cpplint ## 安装cpplint,因为我通常是会用到c++开发,可以用cpplint来检查代码风格
- 在repo根目录安装
pre-commit
的hook
pre-commit install
此时在.git/hooks
下会生成一个pre-commit
文件,可以看到其内容是调用.pre-commit-config.yaml
中的配置
#!/bin/sh
#!/usr/bin/env bash
# File generated by pre-commit: https://pre-commit.com
# ID: 138fd403232d2ddd5efb44317e38bf03
# start templated
INSTALL_PYTHON='C:\Users\edad8\anaconda3\python.exe'
ARGS=(hook-impl --config=.pre-commit-config.yaml --hook-type=pre-commit)
# end templated
HERE="$(cd "$(dirname "$0")" && pwd)"
ARGS+=(--hook-dir "$HERE" -- "$@")
if [ -x "$INSTALL_PYTHON" ]; then
exec "$INSTALL_PYTHON" -mpre_commit "${ARGS[@]}"
elif command -v pre-commit > /dev/null; then
exec pre-commit "${ARGS[@]}"
else
echo '`pre-commit` not found. Did you forget to activate your virtualenv?' 1>&2
exit 1
fi
- 在repo根目录新建
.pre-commit-config.yaml
,并写入所需配置,可参考官网
顶层有一个参数名为repos,repos中每一个元素为repo,代表一个代码库,可以是远程的git链接,也可以是代表当前库,代表当前库时用local
表示。每一个repo中有一个或者多个hook,每个hook代表一个任务。
# 该config文件为该项目的pre-commit的配置文件,用于指定该项目可以执行的git hooks
# 这是pre-commit的全局配置之一,false表示不会遇到第一个错误就停止
fail_fast: false
repos:
# hook所在的仓库
- repo: https://github.com/pre-commit/pre-commit-hooks
# 仓库的版本,可以直接用tag或者分支,但分支是容易发生变化的
# 如果使用分支,则会在第一次安装之后不自动更新
# 通过 `pre-commit autoupdate`指令可以将tag更新到默认分支的最新tag
rev: v4.0.1
# 仓库中的hook id
hooks:
# 定义的hook脚本,在repo的.pre-commit-hooks.yaml中定义
- id: check-added-large-files
# 移除尾部空格符
- id: trailing-whitespace
# 传入参数,不处理makedown
args: [--markdown-linebreak-ext=md]
# 检查是否含有合并冲突符号
- id: check-merge-conflict
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
rev: v2.0.0
hooks:
- id: pretty-format-yaml
# https://github.com/macisamuele/language-formatters-pre-commit-hooks/blob/v2.0.0/language_formatters_pre_commit_hooks/pretty_format_yaml.py
# hook脚本需要的参数,可以在该hook脚本文件中看到
args: [--autofix, --indent, '2']
如果自己定义一些脚本来执行hook的化,repo的值需定义为local,并且在.pre-commit-config.yaml中定义hook的脚本路径
- repo: local
- id: hook_id
name: hook_name
description: 'hook description'
# 脚本路径
entry: bash /path/to/hook.sh # 执行的脚本,这里可以用shell写,也可以用python
language: system
files: \.(py|c|cc|cxx|cpp|cl|cu|h|hpp|hxx)$ ## 可以指定文件,也可以指定文件夹
exclude: ^(ci/*|doc/*/third_parth/*/tools/*|.clang-format)
pass_finenames: fasle