git commit期间通过git hook 的 pre-commit 修改内容并提交

git commit期间通过git hook 的 pre-commit 修改内容并提交

背景

想每次提交代码的时,能自动搜索当前目录下的所有 README.md 生成目录树,并且修改主页展示的README.md。

git hook 介绍

想到了hooks,每次git commit的时,git会主动调用 .git/hooks/pre-commit 这个脚本(默认的*.sample不执行),脚本可以是shell、python、ruby等可执行脚本,只要是 以非零状态 退出会导致中止,就commit失败。

类型触发命令(相同命令按顺序执行)钩子用途
客户端git commitpre-commit提交之前运行,用于检查代码等,非零可以中止过程。加--no-verify可跳过
客户端git commitprepare-commit-msg提交信息编辑器之前,信息被创建之后运行。可以动态插入信息。
客户端git commitcommit-msg接受一个消息参数,可以自动生成提交的消息模版。
客户端git commitpost-commit完成后运行,一般用于通知之类的事情。
客户端git rebasepre-rebase运行git rebase之前,默认的pre-rebase是用来禁止已经推送的提交进行git rebase。
客户端git checkoutpost-checkout运行完成后调用,用于放入大的二进制文件、自动生成文档等。
客户端git mergepre-push验证git控制之外的文件是否存在,可以复制进工作区。
客户端git gc --autopre-auto-gc根据业务是否要中断回收。
客户端替换提交记录的命令触发(git commit --amend、git rebase等)post-rewrite从标准输入中接受重写提交记录。
邮件工作流git amapplypatch-msg确保提交信息符合格式。
邮件工作流git ampost-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.com/docs/githooks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值