python shell,python hook_五分鐘內用Python實現GitHook

 2023-11-19 阅读 33 评论 0

摘要:githooks.pngGithook 也稱 Git 鉤子,是在 Git 倉庫中特定事件發生時自動運行的腳本。它可以讓你自定義 Git 內部的行為,在開發周期中的關鍵點出發自定義行為。python shell?Git Hook 最常見的使用場景包括推行提交信息規范,根據倉庫狀態來改變項目環境&

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/182623.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息