Git 掛鉤

2018-09-27 15:51 更新

和其他版本控制系統(tǒng)一樣,當(dāng)某些重要事件發(fā)生時(shí),Git 以調(diào)用自定義腳本。有兩組掛鉤:客戶端和服務(wù)器端。客戶端掛鉤用于客戶端的操作,如提交和合并。服務(wù)器端掛鉤用于 Git 服務(wù)器端的操作,如接收被推送的提交。你可以隨意地使用這些掛鉤,下面會(huì)講解其中一些。

安裝一個(gè)掛鉤

掛鉤都被存儲(chǔ)在 Git 目錄下的hooks子目錄中,即大部分項(xiàng)目中的.git/hooks。 Git 默認(rèn)會(huì)放置一些腳本樣本在這個(gè)目錄中,除了可以作為掛鉤使用,這些樣本本身是可以獨(dú)立使用的。所有的樣本都是shell腳本,其中一些還包含了Perl的腳本,不過(guò),任何正確命名的可執(zhí)行腳本都可以正常使用 — 可以用RubyPython,或其他。在Git 1.6版本之后,這些樣本名都是以.sample結(jié)尾,因此,你必須重新命名。在Git 1.6版本之前,這些樣本名都是正確的,但這些樣本不是可執(zhí)行文件。

把一個(gè)正確命名且可執(zhí)行的文件放入 Git 目錄下的hooks子目錄中,可以激活該掛鉤腳本,因此,之后他一直會(huì)被 Git 調(diào)用。隨后會(huì)講解主要的掛鉤腳本。

客戶端掛鉤

有許多客戶端掛鉤,以下把他們分為:提交工作流掛鉤、電子郵件工作流掛鉤及其他客戶端掛鉤。

提交工作流掛鉤

有 4個(gè)掛鉤被用來(lái)處理提交的過(guò)程。pre-commit掛鉤在鍵入提交信息前運(yùn)行,被用來(lái)檢查即將提交的快照,例如,檢查是否有東西被遺漏,確認(rèn)測(cè)試是否運(yùn)行,以及檢查代碼。當(dāng)從該掛鉤返回非零值時(shí),Git 放棄此次提交,但可以用git commit --no-verify來(lái)忽略。該掛鉤可以被用來(lái)檢查代碼錯(cuò)誤(運(yùn)行類似lint的程序),檢查尾部空白(默認(rèn)掛鉤是這么做的),檢查新方法(譯注:程序的函數(shù))的說(shuō)明。

prepare-commit-msg掛鉤在提交信息編輯器顯示之前,默認(rèn)信息被創(chuàng)建之后運(yùn)行。因此,可以有機(jī)會(huì)在提交作者看到默認(rèn)信息前進(jìn)行編輯。該掛鉤接收一些選項(xiàng):擁有提交信息的文件路徑,提交類型,如果是一次修訂的話,提交的SHA-1校驗(yàn)和。該掛鉤對(duì)通常的提交來(lái)說(shuō)不是很有用,只在自動(dòng)產(chǎn)生的默認(rèn)提交信息的情況下有作用,如提交信息模板、合并、壓縮和修訂提交等??梢院吞峤荒0迮浜鲜褂?,以編程的方式插入信息。

commit-msg掛鉤接收一個(gè)參數(shù),此參數(shù)是包含最近提交信息的臨時(shí)文件的路徑。如果該掛鉤腳本以非零退出,Git 放棄提交,因此,可以用來(lái)在提交通過(guò)前驗(yàn)證項(xiàng)目狀態(tài)或提交信息。本章上一小節(jié)已經(jīng)展示了使用該掛鉤核對(duì)提交信息是否符合特定的模式。

post-commit掛鉤在整個(gè)提交過(guò)程完成后運(yùn)行,他不會(huì)接收任何參數(shù),但可以運(yùn)行g(shù)it log -1 HEAD來(lái)獲得最后的提交信息。總之,該掛鉤是作為通知之類使用的。

提交工作流的客戶端掛鉤腳本可以在任何工作流中使用,他們經(jīng)常被用來(lái)實(shí)施某些策略,但值得注意的是,這些腳本在clone期間不會(huì)被傳送??梢栽诜?wù)器端實(shí)施策略來(lái)拒絕不符合某些策略的推送,但這完全取決于開發(fā)者在客戶端使用這些腳本的情況。所以,這些腳本對(duì)開發(fā)者是有用的,由他們自己設(shè)置和維護(hù),而且在任何時(shí)候都可以覆蓋或修改這些腳本。

E-mail工作流掛鉤

有3個(gè)可用的客戶端掛鉤用于e-mail工作流。當(dāng)運(yùn)行g(shù)it am命令時(shí),會(huì)調(diào)用他們,因此,如果你沒(méi)有在工作流中用到此命令,可以跳過(guò)本節(jié)。如果你通過(guò)e-mail接收由git format-patch產(chǎn)生的補(bǔ)丁,這些掛鉤也許對(duì)你有用。

首先運(yùn)行的是applypatch-msg掛鉤,他接收一個(gè)參數(shù):包含被建議提交信息的臨時(shí)文件名。如果該腳本非零退出,Git 放棄此補(bǔ)丁??梢允褂眠@個(gè)腳本確認(rèn)提交信息是否被正確格式化,或讓腳本編輯信息以達(dá)到標(biāo)準(zhǔn)化。

下一個(gè)在git am運(yùn)行期間調(diào)用是pre-applypatch掛鉤。該掛鉤不接收參數(shù),在補(bǔ)丁被運(yùn)用之后運(yùn)行,因此,可以被用來(lái)在提交前檢查快照。你能用此腳本運(yùn)行測(cè)試,檢查工作樹。如果有些什么遺漏,或測(cè)試沒(méi)通過(guò),腳本會(huì)以非零退出,放棄此次git am的運(yùn)行,補(bǔ)丁不會(huì)被提交。

最后在git am運(yùn)行期間調(diào)用的是post-applypatch掛鉤。你可以用他來(lái)通知一個(gè)小組或獲取的補(bǔ)丁的作者,但無(wú)法阻止打補(bǔ)丁的過(guò)程。

其他客戶端掛鉤

pre-rebase掛鉤在衍合前運(yùn)行,腳本以非零退出可以中止衍合的過(guò)程。你可以使用這個(gè)掛鉤來(lái)禁止衍合已經(jīng)推送的提交對(duì)象,Git pre-rebase掛鉤樣本就是這么做的。該樣本假定next是你定義的分支名,因此,你可能要修改樣本,把next改成你定義過(guò)且穩(wěn)定的分支名。

git checkout成功運(yùn)行后,post-checkout掛鉤會(huì)被調(diào)用。他可以用來(lái)為你的項(xiàng)目環(huán)境設(shè)置合適的工作目錄。例如:放入大的二進(jìn)制文件、自動(dòng)產(chǎn)生的文檔或其他一切你不想納入版本控制的文件。

最后,在merge命令成功執(zhí)行后,post-merge掛鉤會(huì)被調(diào)用。他可以用來(lái)在 Git 無(wú)法跟蹤的工作樹中恢復(fù)數(shù)據(jù),諸如權(quán)限數(shù)據(jù)。該掛鉤同樣能夠驗(yàn)證在 Git 控制之外的文件是否存在,因此,當(dāng)工作樹改變時(shí),你想這些文件可以被復(fù)制。

服務(wù)器端掛鉤

除了客戶端掛鉤,作為系統(tǒng)管理員,你還可以使用兩個(gè)服務(wù)器端的掛鉤對(duì)項(xiàng)目實(shí)施各種類型的策略。這些掛鉤腳本可以在提交對(duì)象推送到服務(wù)器前被調(diào)用,也可以在推送到服務(wù)器后被調(diào)用。推送到服務(wù)器前調(diào)用的掛鉤可以在任何時(shí)候以非零退出,拒絕推送,返回錯(cuò)誤消息給客戶端,還可以如你所愿設(shè)置足夠復(fù)雜的推送策略。

pre-receive 和 post-receive

處理來(lái)自客戶端的推送(push)操作時(shí)最先執(zhí)行的腳本就是 pre-receive 。它從標(biāo)準(zhǔn)輸入(stdin)獲取被推送引用的列表;如果它退出時(shí)的返回值不是0,所有推送內(nèi)容都不會(huì)被接受。利用此掛鉤腳本可以實(shí)現(xiàn)類似保證最新的索引中不包含非fast-forward類型的這類效果;抑或檢查執(zhí)行推送操作的用戶擁有創(chuàng)建,刪除或者推送的權(quán)限或者他是否對(duì)將要修改的每一個(gè)文件都有訪問(wèn)權(quán)限。

post-receive

掛鉤在整個(gè)過(guò)程完結(jié)以后運(yùn)行,可以用來(lái)更新其他系統(tǒng)服務(wù)或者通知用戶。它接受與 pre-receive 相同的標(biāo)準(zhǔn)輸入數(shù)據(jù)。應(yīng)用實(shí)例包括給某郵件列表發(fā)信,通知實(shí)時(shí)整合數(shù)據(jù)的服務(wù)器,或者更新軟件項(xiàng)目的問(wèn)題追蹤系統(tǒng) —— 甚至可以通過(guò)分析提交信息來(lái)決定某個(gè)問(wèn)題是否應(yīng)該被開啟,修改或者關(guān)閉。該腳本無(wú)法組織推送進(jìn)程,不過(guò)客戶端在它完成運(yùn)行之前將保持連接狀態(tài);所以在用它作一些消耗時(shí)間的操作之前請(qǐng)三思。

update

update 腳本和pre-receive腳本十分類似。不同之處在于它會(huì)為推送者更新的每一個(gè)分支運(yùn)行一次。假如推送者同時(shí)向多個(gè)分支推送內(nèi)容,pre-receive 只運(yùn)行一次,相比之下 update 則會(huì)為每一個(gè)更新的分支運(yùn)行一次。它不會(huì)從標(biāo)準(zhǔn)輸入讀取內(nèi)容,而是接受三個(gè)參數(shù):索引的名字(分支),推送前索引指向的內(nèi)容的 SHA-1 值,以及用戶試圖推送內(nèi)容的 SHA-1 值。如果 update 腳本以退出時(shí)返回非零值,只有相應(yīng)的那一個(gè)索引會(huì)被拒絕;其余的依然會(huì)得到更新。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)