之前在摆弄Pelican发布的时候发现git还有一个叫钩子的东东,处于好奇,想系统的看看自定义git的这一部分。 Pre git这书是学习git强烈推荐的,这里的内容主要来自它的第八章自定义git。
Git 配置
文章开头首先澄清了git的几个配置文件以及其优先级
| 配置文件等级 | 系统级 | 用户级 | 项目级 |
|---|---|---|---|
| git命令 | --system | --global | --local |
| windows路径 | $PROGRAMDATA/Git/config | $HOME/.config/git/config or ~/.gitconfig | $GIT_DIR/config |
| linux路径 | $(prefix)/etc/gitconfig | $HOME/.config/git/config or ~/.gitconfig | $GIT_DIR/config |
然后介绍了几个有用的配置项
core.editor
配置提交时候的默认编辑器
$ git config --global core.editor emacs //配置emacs为默认编辑器
$ git config --global core.editor "atom --wait" //atom官网提供的配置,配置atom为默认编辑器
commit.template
指定提交时候所有的格式模板文件
$ git config --global commit.template ~/.gitmessage.txt
$ git commit
提交时候就会自动完成文件中信息的占位
core.pager
该配置项指定 Git 运行诸如 log 和 diff 等命令所使用的分页器。命令输出超过一页时,自动在每页输出后暂停,可以按空格继续显示,按q退出
help.autocorrect
自动改正并运行命令,如果你把 help.autocorrect 设置成 1,那么只要有一个命令被模糊匹配到了,Git 会自动运行该命令。 help.autocorrect 接受一个代表十分之一秒的整数。 所以如果你把它设置为 50, Git 将在自动执行命令前给你 5 秒的时间改变主意。
merge.tool
可用常用的图形化的diff及merge工具来替代默认的diff及merge工具。
core.autocrlf
$ git config --global core.autocrlf true //提交时自动地把回车和换行转换成换行,而在检出代码时把换行转换成回车和换行(适合windows用户)
$ git config --global core.autocrlf input //提交时把回车和换行转换成换行,检出时不转换(适合Linux用户)
$ git config --global core.autocrlf false //都不转换(适合只在windows工作的用户)
Git 属性
主要讲根目录下.gitattributes文件的设置,这一章兴趣点不大,等以后需要用到了再细看。 不过还是有两点可以关注的,docx2txt对word文件进行版本管理,利用exiftool 对图像进行版本管理。
Git 钩子
终于来到钩子了,这个才是我现在最关心的功能 在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中(.git/hooks默认有一些钩子的例子 ),即可激活该钩子脚本。 钩子的触发完全是根据钩子的文件名来,所以钩子的文件名一定要正确,主要有如下列表:
| 文件名 | 运行条件 | 应用场景 |
|---|---|---|
| pre-commit | 钩子在键入提交信息前运行 | 用于检查即将提交的快照 |
| prepare-commit-msg | 启动提交信息编辑器之前,默认信息被创建之后运行 | 可以结合提交模板来使用它,动态地插入信息。 |
| commit-msg | 用户输入提交信息之后运行,提交动作执行之前 | 在提交通过前验证项目状态或提交信息。 |
| post-commit | 钩子在整个提交过程完成后运行 | 其可以改变 git commit 命令的输出,因此主要被用作通知提醒。 |
| pre-rebase | 运行于变基之前,以非零值退出可以中止变基的过程 | 禁止对已经推送的提交变基 |
| post-rewrite | 被那些会替换提交记录的命令调用(git commit --amend 和 git rebase等) | |
| post-checkout | git checkout 成功运行后 | 项目环境用它调整你的工作目录 |
| post-merge | git merge 成功运行后 | 恢复 Git 无法跟踪的工作区数据 |
| pre-push | git push 运行期间, 更新了远程引用但尚未传送对象时被调用 | 在推送开始之前,用它验证对引用的更新操作 |
| pre-receive | 服务器处理来自客户端的推送操作时 | 阻止对引用进行非快进(non-fast-forward)的更新,或者对该推送所修改的所有引用和文件进行访问控制 |
| update | 为每一个准备更新的分支各运行一次 | 如推送者同时向多个分支推送内容,pre-receive 只运行一次,相比之下 update 则会为每一个被推送的分支各运行一次。 |
| post-receive | 在整个过程完结以后运行 | 用来更新其他系统服务或者通知用户 |
钩子支持很多种脚本语言,Python,Ruby等均支持
下面是一个Demo,在Pelicam提交的过程中自动发布博客,并且上传到github 文件:post-commit
1 2 3 | #!/bin/sh
pelican content -o output -s pelicanconf.py
ghp-import -b master output -p
|
有个坑啊,本来吧这个放在pre-push上面的,然后writer分支提交完后触发mater分支提交,mater分支提交完后又被自己触发,死循环了。。。 最终还是post-commit了。
Comments
There are no comments yet.