githooks.png
Githook 也稱 Git 鉤子,是在 Git 倉庫中特定事件發生時自動運行的腳本。它可以讓你自定義 Git 內部的行為,在開發周期中的關鍵點出發自定義行為。
python shell?Git Hook 最常見的使用場景包括推行提交信息規范,根據倉庫狀態來改變項目環境,和接入持續集成工作流。但是因為腳本可以完全定制,你可以用 Git Hook 來自動化或者優化你開發工作流中任意部分。
Git Hook 是倉庫中特定事件發生時 Git 自動運行的普通腳本。因此 Git Hook 安裝和配置也非常容易。Hook 在本地或服務端倉庫都可以部署,且只會在倉庫中事件發生時被執行。
背景:想在每一次代碼commit的時候發送一封郵件到相關人員的郵箱
python爬蟲教程、前提:閱讀以下文字需要有一定Git基礎的朋友,請參見之前的文章:五步法掌握Git基本操作
實驗環境:
Python3.5
python編程、Pycharm(最順手的IDE而已)
Windows系統 Win7
Hook 存在于每個 Git 倉庫的 .git/hooks 目錄中。當你初始化倉庫時,Git 自動生成這個目錄和一些示例腳本。你可以在某個 .git/hooks 中,查看這些文件,如下圖:
python和java,Hooks目錄.png
注:本地沒有git倉庫的可以隨意git clone一個,但是需要有權限可以做git commit,好做之后的練習。
編寫腳本語言
python tornado?內置的腳本大多是 shell 和 perl 語言實現的,但你也可以使用任何腳本語言,只要它們最后能編譯到可執行文件。每次腳本中 #!/bin/sh 定義了你的文件將如何被解釋。
這次我們采用Python語言來實現GitHook,在Linux系統下可以直接編寫Python腳本,但是在Windows系統下需要做一個小小的轉換。
1)新建一個shell腳本,取名為post-commit,內容如下:
python hook。#!/bin/sh
python3 .git/hooks/post-commit.py
2)新建一個post-commit.py,里面編寫Hook中需要發送郵件的功能
python raise、注:上面一個文件中寫的python3是因為CC先生的Windows環境中同時有python2和python3(Python2和Python3共存),此處特意表明用python3來處理,否則就直接寫python即可。
內容如下:
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from subprocess import check_output
#使用QQ郵箱做測試,填寫QQ的smtp服務器名稱
mail_host = "smtp.qq.com"
#替換成自己使用的QQ郵箱
mail_user = "***@qq.com"
#替換成自己使用的授權碼(非自己的QQ密碼)授權碼詳見;http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
mail_pass = "*****"
#使用Python中的subprocess的check_output函數來捕獲運行了git命令后的標準輸出
log = check_output(['git', 'log', '-1', '-p']).decode()
m = log.split('\n',5)[4]
#分割字符串得到最后的一個參數 email
arg = m.split(' ')[-1]
if arg[:6] == 'email:':
receiver = arg[6:]
print(receiver)
sender = mail_user
receivers = [receiver]
message = MIMEText(log)
message['From'] = Header(mail_user, 'utf-8')
message['To'] = ?Header(str(receivers), 'utf-8')
subject = 'This is a commit log for you!'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP_SSL(mail_host, 465)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
smtpObj.quit()
print ("Send the diff email to:", receiver)
except smtplib.SMTPException as e:
print (e)
3.可以在git命令中嘗試GitHook
隨意改寫一個倉庫中的文件,比如README.md
$git add README.md
2)提交修改
$ git commit -m 'Update readme. email:xgengshax@msn.com',如下圖:
gitcommit.png
4.查看QQ郵箱已發送郵件(此處因為QQ郵箱的安全設置會收到發送失敗的提示郵件,不過這個表示Hook已經成功,只是QQ的安全設置而已)
QQ mail.png
至此,我們已經完成了只要git commit一次,就會發送郵件的簡單功能。
回顧一下使用到的知識點:
Git基礎知識
Python對SMTP的使用
Python中subprocess子進程的使用
拓展:
鉤子的作用域
對于任何 Git 倉庫來說 Hook 都是本地的,而且它不會隨著 git clone 一起復制到新的倉庫。而且因為鉤子是本地的,任何能接觸到倉庫的人都可以修改。對于開發團隊來說,這有很大的影響。所以在開發團隊中維護鉤子是比較復雜的,因為 .git/hooks 目錄不隨你的項目一起拷貝,也不受版本控制影響。一個簡單的解決辦法是把你的 Hook 存在項目的實際目錄中(在 .git 外)。這樣你就可以像其他文件一樣進行版本控制。為了安裝 Hook ,你可以在 .git/hooks 中創建一個符號鏈接,或者簡單地在更新后把它們復制到 .git/hooks 目錄下。
本地 Hook 只影響它們所在的倉庫。以下是最常用的 6 個本地 >Hook:
pre-commit
prepare-commit-msg
commit-msg
post-commit
post-checkout
pre-rebase
前四個 Hook 介入到版本提交的生命周期,后兩個允許執行一些額外的操作,分別為 git checkout 和 git rebase 的安全檢查。所有與帶 pre- 的 Hook 代表即將發生的某個階段,帶 post- 只用于通知。
---------------------
作者:weixin_33695450
來源:CSDN
原文:https://blog.csdn.net/weixin_33695450/article/details/86909554
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态