之前在摆弄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.

Add a Comment

You can use the Markdown syntax to format your comment.

Comment Atom Feed