git commit期间通过git hook 的 pre-commit 修改内容并提交
- 背景
- git hook 介绍
- 通过 python 自动生成 README.md 目录树脚本
背景
想每次提交代码的时,能自动搜索当前目录下的所有 README.md 生成目录树,并且修改主页展示的README.md。
git hook 介绍
想到了hooks,每次git commit的时,git会主动调用 .git/hooks/pre-commit 这个脚本(默认的*.sample不执行),脚本可以是shell、python、ruby等可执行脚本,只要是 以非零状态 退出会导致中止,就commit失败。
类型 | 触发命令(相同命令按顺序执行) | 钩子 | 用途 |
---|---|---|---|
客户端 | git commit | pre-commit | 提交之前运行,用于检查代码等,非零可以中止过程。加--no-verify 可跳过 |
客户端 | git commit | prepare-commit-msg | 提交信息编辑器之前,信息被创建之后运行。可以动态插入信息。 |
客户端 | git commit | commit-msg | 接受一个消息参数,可以自动生成提交的消息模版。 |
客户端 | git commit | post-commit | 完成后运行,一般用于通知之类的事情。 |
客户端 | git rebase | pre-rebase | 运行git rebase之前,默认的pre-rebase是用来禁止已经推送的提交进行git rebase。 |
客户端 | git checkout | post-checkout | 运行完成后调用,用于放入大的二进制文件、自动生成文档等。 |
客户端 | git merge | pre-push | 验证git控制之外的文件是否存在,可以复制进工作区。 |
客户端 | git gc --auto | pre-auto-gc | 根据业务是否要中断回收。 |
客户端 | 替换提交记录的命令触发(git commit --amend、git rebase等) | post-rewrite | 从标准输入中接受重写提交记录。 |
邮件工作流 | git am | applypatch-msg | 确保提交信息符合格式。 |
邮件工作流 | git am | post-applypatch | 提交产生后,用于通知,但无法停止打补丁。 |
服务器端 | 收到客户端的push后 | pre-receive | 可以用来阻止非快进(non-fast-forward)的更新。 |
服务器端 | 收到客户端的receive后 | update | 类似pre-receive,不同于会在每个准备更新的分支各运行一次。 |
服务器端 | 收到客户端的receive后 | post-receive | 完成运行后,用来通知管理员、CI等。 |
通过 python 自动生成 README.md 目录树脚本
把 pre-commit 文件放置至 .git/hooks/pre-commit,增加可执行权限。
chmod +x .git/hooks/pre-commit
git commit 之前会检查当前目录的所有 README.md 正则取# name描述 生成 directory 树。
主体逻辑介绍:
#获取当前目录的README.md
main_reademe_path = os.path.abspath('.')+'/README.md'
#获取当前目录下的所有README.md
readme_files = allPath(os.path.abspath('.'), main_reademe_path)
#整理按最新排在前面
readme_files.sort(reverse=True)
#整理刚刚倒序的lsit为dict
readme_lists = formatFiles(readme_files)
#递归的生成目录树结构
readme_source = iterdict(readme_lists)
#重写主README.md
replaceFile(readme_source, main_reademe_path)
#git提交主README.md
g = git.cmd.Git(os.path.abspath('.'))
g.add(main_reademe_path)
效果图
参考资料:
https://www.git-scm/docs/githooks
更多推荐
git commit期间通过git hook 的 pre-commit 修改内容并提交
发布评论