yii urlmanager配置post不生效_一文帶你徹底學會 Git Hooks 配置

你好,我是小桔,是一個沒有感情的代碼崽。

今天給大家介紹一下 Git Hooks,相信 Git 大家都在用吧,Git 除了用作版本控制,還有許多高級功能,Git Hooks 就是其中之一。

本文環境:

  • Git 版本:2.27.0
  • Husky 版本:4.2.5
  • Node.js 版本:12.16.2

前言

做過前端的同學對 Hook 這個東西應該很了解吧,后端也是有 Hook 這種概念的,比如 Java 的@PostConstruct,也是一種 Hook 的體現。簡單來說,Hook 就是在執行某個事件之前或之后進行一些其他額外的操作

舉個栗子,張三現在要吃飯,那么吃飯就是一個事件,吃飯前和吃飯后就可以稱為兩個鉤子。現在你想讓張三在吃飯前洗下手,那么我們就可以在吃飯前這個鉤子這里,設置一個洗手的動作。張三在每次吃飯前,都會檢查一下這個鉤子,有什么要做的,都會照做。這樣,就實現了我們的需求。

Git 也是如此,在 Git 中也有許多的事件(commit、push 等等),每個事件也是對應了有不同的鉤子的(如 commit 前,commit 后),那么我們就可以在這些鉤子這里配置一些自己需要執行的操作來實現各種各樣的需求。

使用

真實場景

可能初次了解 Git Hooks 的同學會有一些疑問:這個東西到底能干嘛?我以前沒用過它不也一樣好好的嗎?我干嘛要用它?

其實這說得很對,**任何技術都是有需求采用,沒有需求就別去硬塞,永遠記住:技術為業務服務。**但是這并不妨礙你先去了解它,畢竟,只有你先知道了這項技術能解決什么樣的問題,日后當你遇到相應的問題時,你才知道該用什么技術去解決。

這里我給出一個真實的場景,是我們團隊在開發 Lin UI 的時候遇到的:

我們的 Git 倉庫中包含了編譯后的代碼,所以每次修改了源碼,都需要運行一下編譯命令,然后把源碼和編譯后的代碼一起提交到 Git 倉庫,這個流程沒什么問題。但是,人腦不是電腦,總會有疏忽的時候,經常會出現這樣一種情況:修改了源碼,卻忘記了運行編譯命令,最后只把源碼提交到了 Git 倉庫,導致線上倉庫的源碼和編譯產物不一致、

這個問題雖然不是特別嚴重,但老是出現也總歸不好。所以我們就想了一個辦法,不再手動編譯,把編譯任務交給 CI 去做,這樣就不存在這樣的問題。

但事情總是沒那么順利,因為我們在本地開發調試的時候是需要編譯代碼的,所以就會生成一部分編譯代碼,在使用 Git 時,我們經常會使用git add .命令,會把所有修改了的代碼都提交到倉庫,這顯示是不行的。因為現在我們已經把編譯交給 CI 去做了,并且為了 Code Review 方便,編譯代碼不應該再提交到倉庫了。如果每次手動去把編譯代碼去除,又非常麻煩,那該怎么辦呢?

這種情況,就可以使用 Git Hooks 幫我們在每次提交前自動把編譯代碼去掉了。

PS:這個場景雖然不那么常見和通用,但確實是在開發中真實遇見的。

Git Hooks 介紹

Git Hooks 的實現其實非常簡單,就是就.git/hooks文件下,保存了一些 shell 腳本,然后在對應的鉤子中執行這些腳本就行了。比如下圖中,這是一個還沒有配置 Git Hooks 的倉庫,默認會有很多.sample結尾的文件,這些都是示例文件

2056987a70af77987b7d563c0d38716e.png

我們打開pre-commit.sample文件看一下其中的內容,大致意思是說這是一個示例,做了一些格式方面的檢測,這個腳本默認是不生效的,如果要生效,把文件名改為pre-commit.sample即可

d3489965a0b2b4e51c4b22e031d18d24.png

pre-commit這個鉤子是在git commit命令執行之前觸發

Git 支持的所有鉤子見下表(加粗的為常用鉤子):

Git Hook調用時機說明
pre-applypatchgit am執行前
applypatch-msggit am執行前
post-applypatchgit am執行后不影響git am的結果
pre-commitgit commit執行前可以用git commit --no-verify繞過
commit-msggit commit執行前可以用git commit --no-verify繞過
post-commitgit commit執行后不影響git commit的結果
pre-merge-commitgit merge執行前可以用git merge --no-verify繞過。
prepare-commit-msggit commit執行后,編輯器打開之前
pre-rebasegit rebase執行前
post-checkoutgit checkoutgit switch執行后如果不使用--no-checkout參數,則在git clone之后也會執行。
post-mergegit commit執行后在執行git pull時也會被調用
pre-pushgit push執行前
pre-receivegit-receive-pack執行前
update
post-receivegit-receive-pack執行后不影響git-receive-pack的結果
post-updategit-receive-packgit push 作出反應并更新倉庫中的引用時
push-to-checkout當``git-receive-packgit push做出反應并更新倉庫中的引用時,以及當推送試圖更新當前被簽出的分支且receive.denyCurrentBranch配置被設置為updateInstead`時
pre-auto-gcgit gc --auto執行前
post-rewrite執行git commit --amendgit rebase
sendemail-validategit send-email執行前
fsmonitor-watchman配置core.fsmonitor被設置為.git/hooks/fsmonitor-watchman.git/hooks/fsmonitor-watchmanv2
p4-pre-submitgit-p4 submit執行前可以用git-p4 submit --no-verify繞過
p4-prepare-changelistgit-p4 submit執行后,編輯器啟動前可以用git-p4 submit --no-verify繞過
p4-changelistgit-p4 submit執行并編輯完changelist message可以用git-p4 submit --no-verify繞過
p4-post-changelistgit-p4 submit執行后
post-index-change索引被寫入到read-cache.c do_write_locked_index

PS:完整鉤子說明,請參考官網鏈接

Husky 配置

從上面的介紹中,我們知道 Git Hook 保存在 .git 文件夾中。不知你有沒有發現這會有一個問題?可能細心的同學已經知道了,Git 是一個多人協作工具,那按理說 Git 倉庫中的所有文件都應該被跟蹤并且上傳至遠程倉庫的。但是有個例外,.git文件夾不會,這就導致一個問題,我們在本地配置好 Git Hook 后,怎么分享給其他小伙伴兒呢?copy 嗎?那未免太 low 了,都用 Git 了,還 copy,也太不優雅了。這時候,就輪到 Husky 出場了。

Husky 是一個讓配置 Git 鉤子變得更簡單的工具(題外話:Husky 是哈士奇的意思,我猜可能是作者養了條二哈)

下面這些流行的項目都在使用 Husky,可見它確實是一個非常好用的工具:

  • webpack
  • babel
  • create-react-app
  • ……

Husky 的原理是讓我們在項目根目錄中寫一個配置文件,然后在安裝 Husky的時候把配置文件和 Git Hook 關聯起來,這樣我們就能在團隊中使用 Git Hook 了。

下面開始配置 Husky

第一步

使用 npm 初始化你的項目(如果項目已有 package.json,請跳至第二步)

npm?init?-y

第二步

安裝 Husky

//?注意?Node.js?版本要?>=10
npm?install?husky?-D

第三步

書寫配置文件,4.2.5 版本的 Husky 共支持以下幾種格式的配置文件:

  • .huskyrc
  • .huskyrc.json
  • .huskyrc.yaml
  • .huskyrc.yml
  • .huskyrc.js
  • husky.config.js

個人習慣,這里我采用的是.huskyrc,在其中書寫 json 格式的配置,如下:

{
??"hooks":?{
????"pre-commit":?"git?restore?-W?-S?dist?examples/dist"
??}
}

是不是很簡單,我們來解讀一下這個配置文件。hooks這個對象中,key 就是鉤子名,而 value 就是需要執行的命令。上面這個配置的含義就是,在每次執行 git commit之前,都會把distexamples/dit目錄下的修改回滾(這兩個目錄就是編譯產生的代碼),就不用擔心誤把編譯后的代碼提交到倉庫中了。

上面我們只寫了一條命令,如果想執行兩條命令怎么辦呢?比如我還想在git commit之前用 EsLint 檢查一下代碼質量,我們可以像下面這樣寫:

{
??"hooks":?{
????"pre-commit":?"git?restore?-W?-S?dist?examples/dist?&&?eslint?."
??}
}

是的,就是這么簡單。如果 EsLint 檢測不通過,那么git commit是會被阻止的,就不用擔心"垃圾代碼"被提交到線上倉庫了。

Husky 注意事項

Husky 讓我們可以很方便的配置 Git Hooks,同時,也提供了一些實用方便的小技巧以及一些我們需要注意的點

不支持的鉤子

Husky 不支持服務端 Git 的鉤子:

  • pre-receive
  • update
  • post-receive

跳過所有鉤子

有時你可能不想運行鉤子,那么可以像下面這樣跳過:

HUSKY_SKIP_HOOKS=1?git?rebase?...

禁用自動安裝

如果你不想 Husky 為你自動安裝鉤子(比如 clone 了一個第三方的庫,想要自己開發時),可以這樣做:

HUSKY_SKIP_INSTALL=1?npm?install

最后

本文介紹了 Git Hooks 具體有哪些,并講解了如何用 Husky 便捷的配置 Git Hook。下一篇文章,我會教你如何用 commitlint 結合 Husky 來規范團隊的 commit 信息,如果有興趣的話,記得一定要關注我哦!

我是小桔,歡迎關注我的微信公眾號,帶你了解更多前后端知識。

49f860ea7cdd9621891e097ce8277241.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260413.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tiff – 值得你體驗一下的可視化的字體對比工具

Tiff 是一款字體對比工具,可視化對比兩種字體之間的差異。這是一個工具來幫助比較兩種字體,同時學習排版。在這一點上,谷歌 Web 字體作為 Tiff 外部字體文件的唯一來源。由于應用程序使用的一些功能需要 HTML5 和 CSS3 支持,因此請…

[.NET] 建構子中傳遞子對象的對象

在設計對象繼承的時候&#xff0c;父對象建構子會需要一些參數&#xff0c;這些參數可以由子對象建構子透過base關鍵詞來提供。 namespace Test001 {public class ParentClass{// Constructorspublic ParentClass(IEnumerable<string> dataCollection){this.DataCollecti…

php基礎教程(三):變量

1、php變量規則 變量以 $ 符號開頭&#xff0c;其后是變量的名稱變量名稱必須以字母或下劃線開頭變量名稱不能以數字開頭變量名稱只能包含字母數字字符和下劃線&#xff08;A-z、0-9 以及 _&#xff09;變量名稱對大小寫敏感&#xff08;$y 與 $Y 是兩個不同的變量&#xff09;…

操作系統實驗文件管理_系統設計硬核知識(5)——操作系統的文件管理

操作系統對計算機的管理包括兩個方面&#xff1a;硬件資源和軟件資源。硬件資源的管理包括CPU 的管理、存儲器的管理、設備管理等&#xff0c;主要解決硬件資源的有效和合理利用問題。軟件資源包括各種系統程序、各種應用程序、各種用戶程序&#xff0c;也包括大量的文檔材料、…

錯誤 0xc0202049: 數據流任務 1: 無法在只讀列“ID”中插入數據

數據庫導入導出時總失敗&#xff0c;錯誤信息如下&#xff1a; 正在驗證 (錯誤) 消息錯誤 0xc0202049: 數據流任務 1: 無法在只讀列“ID”中插入數據。 (SQL Server 導入和導出向導) 錯誤 0xc0202045: 數據流任務 1: 驗證列元數據失敗。 (SQL Server 導入和導出向導) 錯誤 0xc0…

python中的items方法_Python 字典的items()方法和iteritems()方法有什么不同?【面試題詳解】...

今天愛分享給大家帶來Python 字典的items()方法和iteritems()方法有什么不同?【面試題詳解】&#xff0c;希望能夠幫助到大家。 字典是 Python 語言中唯一的映射類型。映射類型對象里哈希鍵(鍵&#xff0c;key)和指向的對象&#xff08;值&#xff0c;value)是多對一的關系&am…

大網高級技術筆記(一)

防偽碼&#xff1b;黑發不知勤學早&#xff0c;白首方悔讀書遲本章目標&#xff1a;理解消化動態路由協議與OSPF協議并應用于實際工作中。第一章 動態路由協議一、按照路由執行的算法分類距離矢量路由協議&#xff1a;RIP、IGRP鏈路狀態路由協議&#xff1a;OSPE、IS-IS二、RIP…

容器類基礎篇(一)

容器類&#xff1a;用來解決數組具有固定尺寸而使得靈活性受限的問題。基本的容器類&#xff08;集合類&#xff09;有&#xff1a;List、Set、Queue、Map。 Java容器類類庫的用途是用來“保存對象”&#xff0c;這分為兩個不同的大類&#xff1a; 1.Collection&#xff08;集合…

阿里MySQL讀寫一致_阿里面試題:如何保證緩存與數據庫的雙寫一致性?

作者&#xff1a;你是我的海嘯出處&#xff1a;https://blog.csdn.net/chang384915878/article/details/86756463只要用緩存&#xff0c;就可能會涉及到緩存與數據庫雙存儲雙寫&#xff0c;你只要是雙寫&#xff0c;就一定會有數據一致性的問題&#xff0c;那么你如何解決一致性…

反射小應用之DataTable和ListT互操作

反射小應用之DataTable和List<T>互操作 在程序中&#xff0c;往往會遇到一些小情況&#xff0c;就是數據庫取出來的時候為了方便直接將數據通過存儲在DataSet或DataTable中&#xff0c;這樣做的一個后果是在日后的的對數據進行”細“操作時&#xff0c;就發現它可能沒有L…

python適合什么樣的人群_什么樣的人比較適合選擇Python開發+人工智能技術?

原標題&#xff1a;什么樣的人比較適合選擇Python開發人工智能技術&#xff1f; 互聯網行業最近幾年來確實成為了競相追捧的行業&#xff0c;人工智能、大數據的不斷發展讓Python開發技術成為了繼Java開發之后的又一熱門編程語言。我們都知道&#xff0c;想要學習Python開發編程…

java 8 方法引用(method references)

1 什么是方法引用&#xff08;method references&#xff09;java 8 添加了一個很熟悉但是又很陌生的符號::。 你也許會看到這樣的代碼System.out::println其實就是方法引用&#xff08;method references&#xff09;。由于java 8 把方法/函數也作為第一輸入參數。所以你會看到…

SWT中Button事件的幾種不同寫法

1&#xff0e;匿名內部類寫法button.addSelectionListener(new SelectionAdapter(){Overridepublic void widgetSelected(SelectionEvent e){.....}});釋&#xff1a;當button被單擊時&#xff0c;底層就會檢查button是否注冊了相對就的監聽器&#xff0c;如果有&#xff0c;底…

python中fetchall函數_python中查詢數據庫時fetchone()函數和fetchall()函數的區別

我們在用python操作數據庫的時候,經常會碰見兩個函數:fetchone()和fetchall()剛開始學習的時候可能會搞不清楚他們兩個的區別其實非常簡單首先fetchone()函數它的返回值是單個的元組,也就是一行記錄,如果沒有結果,那就會返回null其次是fetchall()函數,它的返回值是多個元組,即返…

文字對齊格式

text-align:justify; letter-spacing:5px; line-height:40px; text-indent:40px 轉載于:https://www.cnblogs.com/mrcln/p/3757148.html

excel vba 從入門到精通_VBA詞匯-基本元素篇

在公眾號發布學習VBA需要哪些基礎知識這篇文章后&#xff0c;有朋友給我們留言&#xff0c;希望可以出一份VBA基礎的英語知識貼。其實相關的內容我們會在后面所對應知識點一一進行講解&#xff0c;提前劇透其實會少很多學習未知知識的樂趣哦~ 我們會將所涉及的基礎單詞和其說明…

jQuery基礎:remove()與 detach()區別

1、detach&#xff08;&#xff09; detach() 方法移除被選元素&#xff0c;包括所有文本和子節點。這個方法會保留 jQuery 對象中的匹配的元素&#xff0c;因而可以在將來再使用這些匹配的元素。detach() 會保留所有綁定的事件、附加的數據&#xff0c;這一點與 remove() 不同…

python保存模型 特征_Pytorch提取模型特征向量保存至csv的例子

Pytorch提取模型特征向量# -*- coding: utf-8 -*-"""dj"""import torchimport torch.nn as nnimport osfrom torchvision import models, transformsfrom torch.autograd import Variableimport numpy as npfrom PIL import Imageimport torchvi…

Matlab畫圖-非常具體,非常全面

Matlab畫圖 強大的畫圖功能是Matlab的特點之中的一個&#xff0c;Matlab提供了一系列的畫圖函數&#xff0c;用戶不須要過多的考慮畫圖的細節&#xff0c;僅僅須要給出一些基本參數就能得到所需圖形&#xff0c;這類函數稱為高層畫圖函數。此外&#xff0c;Matlab還提供了直接對…

openfeign使用_Feign使用基于配置服務發現

之前寫了篇《Feign在實際項目中的應用實踐總結》Feign在實際項目中的應用實踐總結 - 沐風之境 - 博客園?www.cnblogs.com總結了在一般項目中如何使用Feign這個提升開發效率的利器。最近在看Feign的文檔的時候發現了之前遺漏的一些點&#xff0c;所以寫了這篇文章進行補充。pom…