git hooks
小閆辛苦碼了 1358 個字
文章可能占用您 4 分鐘
歡迎關(guān)注「全棧技術(shù)精選」
今日分享:Ask yourself, who do you want to be? Figure out for yourself what makes you happy, no matter how crazy it may sound to other people.
如同 flask 框架的請求鉤子一樣,git 也有鉤子 (hook) 的概念,下面就讓我們一起來看看吧。更多精彩文章請關(guān)注公眾號『Pythonnote』或者『全棧技術(shù)精選』
1.概念
執(zhí)行某些命令前后,統(tǒng)一進行的操作。比如我要在每次 commit 前核查代碼,就可以使用鉤子 pre-commit。
2.分類
1.客戶端鉤子:提交或者合并時,在客戶端進行的操作。
2.服務(wù)端鉤子:接收推送時,在服務(wù)器端進行的操作。
3.原理
這些鉤子本質(zhì)上是一些腳本,在執(zhí)行特定命令時調(diào)用這些腳本以達到目的。更多精彩文章請關(guān)注公眾號『Pythonnote』
大家可以在任意一個 git 管理的倉庫下 .git/hooks 目錄中找到官方示例。
╰─? ls # cd .git/hooksapplypatch-msg.sample fsmonitor-watchman.sample preapplypatch.sample pre-push.sample pre-receive.sample update.samplecommit-msg.sample post-update.sample pre-commit.sample pre-rebase.sample prepare-commit-msg.sample
當(dāng)你查看這些示例時,會發(fā)現(xiàn)他們其實就是一些
shell腳本,也會包含一些其他語言的代碼,如perl。語言不限定,甚至可以使用
Python編寫它們。
4.使用
如果想體驗一下官方示例,可以將官方示例的鉤子腳本后綴名刪掉,這樣它就被激活了。
mv pre-commit.sample pre-commit
4.1 示例
我希望在每次 commit 前輸出一句話:
this is pre-commit hook
步驟:
1.將官方示例進行備份
cp pre-commit.sample pre-commit.sample.bak
2.修改 pre-commit 鉤子腳本
vim pre-commit.sample#!/bin/shecho 'this is pre-commit hook'
3.激活鉤子更多精彩文章請關(guān)注公眾號『全棧技術(shù)精選』
mv pre-commit.sample pre-commit
4.在倉庫做一些改變?nèi)缓筮M行提交
... do somethinggit add .git commit -m 'test hooks'
5.輸出信息如下

從圖中可以看到執(zhí)行了我們的腳本。
5.客戶端常用的 hooks
5.1 pre-commit
在執(zhí)行 git commit 鍵入提交信息前運行,如果腳本輸出非零值,那么就會停止提交。關(guān)注公眾號『全棧技術(shù)精選』
用途:做初步的 code review ,檢查代碼風(fēng)格是否符合規(guī)范;檢查代碼是否有多余空白字符等等。
5.2 post-commit
在整個提交過程完成后運行。
用途:提示信息。
5.3 pre-push
在 git push 運行期間, 更新了遠程引用但尚未傳送對象時被調(diào)用。它接受遠程分支的名字和位置作為參數(shù),同時從標(biāo)準(zhǔn)輸入中讀取一系列待更新的引用。如果腳本輸出非零值,那么就會停止推送。關(guān)注公眾號『Pythonnote』或者『全棧技術(shù)精選』
用途:在推送開始之前,用它驗證對引用的更新操作。
5.4 post-merge
在 git merge 成功運行后,post-merge 鉤子會被調(diào)用。
用途:可以用它恢復(fù) Git 無法跟蹤的工作區(qū)數(shù)據(jù),比如權(quán)限數(shù)據(jù)。這個鉤子也可以用來驗證某些在 Git 控制之外的文件是否存在,這樣你就能在工作區(qū)改變時,把這些文件復(fù)制進來。
排版:小閆
圖片素材:小閆
文案:小閆
長按掃描下方二維碼即刻關(guān)注小閆








