Git鉤子(Hooks)之commit之前自動執行腳本

介紹

官方文檔:

  • 英文:https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
  • 中文:https://git-scm.com/book/zh/v2/自定義-Git-Git-鉤子

下面只復制了pre-commit部分文檔,其他詳見官方文檔。

Git Hooks

Like many other Version Control Systems, Git has a way to fire off custom scripts when certain important actions occur. There are two groups of these hooks: client-side and server-side. Client-side hooks are triggered by operations such as committing and merging, while server-side hooks run on network operations such as receiving pushed commits. You can use these hooks for all sorts of reasons.

Installing a Hook

The hooks are all stored in the hooks subdirectory of the Git directory. In most projects, that’s .git/hooks. When you initialize a new repository with git init, Git populates the hooks directory with a bunch of example scripts, many of which are useful by themselves; but they also document the input values of each script. All the examples are written as shell scripts, with some Perl thrown in, but any properly named executable scripts will work fine – you can write them in Ruby or Python or whatever language you are familiar with. If you want to use the bundled hook scripts, you’ll have to rename them; their file names all end with .sample.

To enable a hook script, put a file in the hooks subdirectory of your .git directory that is named appropriately (without any extension) and is executable. From that point forward, it should be called. We’ll cover most of the major hook filenames here.

Client-Side Hooks

There are a lot of client-side hooks. This section splits them into committing-workflow hooks, email-workflow scripts, and everything else.

NoteIt’s important to note that client-side hooks are not copied when you clone a repository. If your intent with these scripts is to enforce a policy, you’ll probably want to do that on the server side; see the example in An Example Git-Enforced Policy.
Committing-Workflow Hooks

The first four hooks have to do with the committing process.

The pre-commit hook is run first, before you even type in a commit message. It’s used to inspect the snapshot that’s about to be committed, to see if you’ve forgotten something, to make sure tests run, or to examine whatever you need to inspect in the code. Exiting non-zero from this hook aborts the commit, although you can bypass it with git commit --no-verify. You can do things like check for code style (run lint or something equivalent), check for trailing whitespace (the default hook does exactly this), or check for appropriate documentation on new methods.

翻譯:

Git 鉤子

和其它版本控制系統一樣,Git 能在特定的重要動作發生時觸發自定義腳本。 有兩組這樣的鉤子:客戶端的和服務器端的。 客戶端鉤子由諸如提交和合并這樣的操作所調用,而服務器端鉤子作用于諸如接收被推送的提交這樣的聯網操作。 你可以隨心所欲地運用這些鉤子。

安裝一個鉤子

鉤子都被存儲在 Git 目錄下的 hooks 子目錄中。 也即絕大部分項目中的 .git/hooks 。 當你用 git init 初始化一個新版本庫時,Git 默認會在這個目錄中放置一些示例腳本。 這些腳本除了本身可以被調用外,它們還透露了被觸發時所傳入的參數。 所有的示例都是 shell 腳本,其中一些還混雜了 Perl 代碼,不過,任何正確命名的可執行腳本都可以正常使用 —— 你可以用 Ruby 或 Python,或任何你熟悉的語言編寫它們。 這些示例的名字都是以 .sample 結尾,如果你想啟用它們,得先移除這個后綴。

把一個正確命名(不帶擴展名)且可執行的文件放入 .git 目錄下的 hooks 子目錄中,即可激活該鉤子腳本。 這樣一來,它就能被 Git 調用。接下來,我們會講解常用的鉤子腳本類型。

客戶端鉤子

客戶端鉤子分為很多種。 下面把它們分為:提交工作流鉤子、電子郵件工作流鉤子和其它鉤子。

Note需要注意的是,克隆某個版本庫時,它的客戶端鉤子 并不 隨同復制。 如果需要靠這些腳本來強制維持某種策略,建議你在服務器端實現這一功能。 (請參照 使用強制策略的一個例子 中的例子。)
提交工作流鉤子

前四個鉤子涉及提交的過程。

pre-commit 鉤子在鍵入提交信息前運行。 它用于檢查即將提交的快照,例如,檢查是否有所遺漏,確保測試運行,以及核查代碼。 如果該鉤子以非零值退出,Git 將放棄此次提交,不過你可以用 git commit --no-verify 來繞過這個環節。 你可以利用該鉤子,來檢查代碼風格是否一致(運行類似 lint 的程序)、尾隨空白字符是否存在(自帶的鉤子就是這么做的),或新方法的文檔是否適當。

分析

結合文檔說明,git init之后其實就會生成hooks示例文件,在./.git/hooks/目錄下,*.sample就是,使用的時候我們需要把后綴.sample去掉,它就會生效了。

$ ls -alh ./.git/hooks/
total 53K
drwxr-xr-x 1 Administrator 197121    0  526 23:59 ./
drwxr-xr-x 1 Administrator 197121    0  527 18:52 ../
-rwxr-xr-x 1 Administrator 197121  478  526 23:59 applypatch-msg.sample*
-rwxr-xr-x 1 Administrator 197121  896  526 23:59 commit-msg.sample*
-rwxr-xr-x 1 Administrator 197121 4.6K  526 23:59 fsmonitor-watchman.sample*
-rwxr-xr-x 1 Administrator 197121  189  526 23:59 post-update.sample*
-rwxr-xr-x 1 Administrator 197121  424  526 23:59 pre-applypatch.sample*
-rwxr-xr-x 1 Administrator 197121 1.7K  526 23:59 pre-commit.sample*
-rwxr-xr-x 1 Administrator 197121  416  526 23:59 pre-merge-commit.sample*
-rwxr-xr-x 1 Administrator 197121 1.5K  526 23:59 prepare-commit-msg.sample*
-rwxr-xr-x 1 Administrator 197121 1.4K  526 23:59 pre-push.sample*
-rwxr-xr-x 1 Administrator 197121 4.8K  526 23:59 pre-rebase.sample*
-rwxr-xr-x 1 Administrator 197121  544  526 23:59 pre-receive.sample*
-rwxr-xr-x 1 Administrator 197121 2.8K  526 23:59 push-to-checkout.sample*
-rwxr-xr-x 1 Administrator 197121 3.6K  526 23:59 update.sample*

具體使用

以pre-commit為例,進行測試,文檔介紹了例子是在提交之前進行代碼的操作,這里就簡單點:將當前時間打印到某個文件。

# 新建shell
echo 'date >> now_time.txt' > print_time.sh
chmod +x print_time.sh# 去掉后綴
mv ./.git/hooks/pre-commit.sample ./.git/hooks/pre-commit
vim ./.git/hooks/pre-commit# <<<內容
#!/bin/sh
echo "Running pre-commit hook"
sh ./print_time.sh
git add now_time.txt
# 內容>>>git add print_time.sh
git commit -m "feat: add print_time.sh"# 提交打印的日志
$ git commit -m "feat: update print_time.sh"
Running pre-commit hook
[main c9bf1ef] feat: update test.sh2 files changed, 2 insertions(+)create mode 100644 print_time.shcreate mode 100644 now_time.txt

至此,成功實現在提交之前自動執行腳本的效果。

其他類型的hooks其實就是嵌入的時機不同,當然也有一些各自的屬性,可參照這個pre-commit進行實現。

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

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

相關文章

【絕地求生game】

編寫一個完整的《絕地求生》這樣的游戲程序代碼是一個龐大的工程&#xff0c;涉及到成千上萬行的代碼和復雜的多模塊協作。在這里&#xff0c;我可以提供一個非常簡化的示例&#xff0c;用于演示游戲編程中可能用到的基本概念&#xff0c;比如玩家移動、基本物理和簡單的游戲邏…

【Java面試】四、MySQL篇(上)

文章目錄 1、定位慢查詢2、慢查詢的原因分析3、索引3.1 數據結構選用&#xff1a;二叉樹 & 紅黑樹3.2 數據結構選用&#xff1a;B樹 4、聚簇索引、非聚簇索引、回表查詢4.1 聚簇索引、非聚簇索引4.2 回表查詢 5、覆蓋索引、超大分頁優化5.1 覆蓋索引5.2 超大分頁處理 6、索…

聯發科MT8370平臺Genio 510物聯網應用程序處理器詳細規格參數

MT8370是一款高度集成、功能強大的平臺&#xff0c;專為各種人工智能(AI)和物聯網(IoT)用例而設計&#xff0c;這些用例需要高性能邊緣處理、先進的多媒體和連接功能、多個高分辨率攝像頭、連接的觸摸屏顯示器以及多任務高級操作系統(HLOS)的使用。http://Genio 510 (MT8370) E…

Mybatis源碼剖析

文章目錄 一、前置1.1概念ORMSqlSession會話 二、快速入門2.1 SpringBoot整合Mybatis2.2 XML配置2.2.1 路徑位置2.2.2 名稱2.2.3 configuration標簽內容環境environments標簽映射器mappers標簽 2.3 Mapper接口2.3.1 單Mybatis項目2.3.2 SpringBoot整合mybatis2.3.3 m整合mybati…

字符串函數(2)<C語言>

前言 快一周沒更博客了&#xff0c;最近有點忙&#xff0c;今天閑下來了&#xff0c;還是不行&#xff0c;繼續干&#xff0c;書接上回繼續介紹字符串函數&#xff1a;strncpy()、strncat()、strcmp()、strtok()使用、strstr()使用以及模擬實現、strerror()使用。 strncpy()、s…

blender serpens3 個人總結

Serpens 全節點個人備注 快捷鍵 &#xff1a;shift v&#xff1a; 從復制版 添加執行操作&#xff08;blender任何執行動作按鈕&#xff0c;右鍵可以獲取操作命令&#xff09; 概念分析&#xff1a; 屬性&#xff08;Properties&#xff09;&#xff1a;用于定義持久性數據…

揭秘網絡編程:同步與異步IO模型的實戰演練

摘要 ? 在網絡編程領域&#xff0c;同步(Synchronous)、異步(Asynchronous)、阻塞(Blocking)與非阻塞(Non-blocking)IO模型是核心概念。盡管這些概念在多篇文章中被廣泛討論&#xff0c;它們的抽象性使得徹底理解并非易事。本文旨在通過具體的實驗案例&#xff0c;將這些抽象…

在React中使用Sass實現Css樣式管理-10

0. 什么是Sass Sass(Syntactically Awesome Stylesheets)是一個 CSS 預處理器&#xff0c;是 CSS 擴展語言&#xff0c;可以幫助我們減少 CSS 重復的代碼&#xff0c;節省開發時間&#xff1a; Sass 引入合理的樣式復用機制&#xff0c;可以節約很多時間來重復。支持變量和函…

【HM】簡單說明白:裝飾器@State、@Prop、@Link、@Provide、@Consume修飾變量,@Watch監聽變量狀態發生變化

首先要明白什么是“狀態變量”&#xff1f;即被狀態裝飾器&#xff08;State、Prop、Link、Provide、Consume&#xff09;修飾的變量&#xff0c;比如 State str : string; str就是狀態變量。狀態變量值的改變會引起UI界面重新渲染。 State State裝飾的變量&#xff0c;是私…

C++之“流”-第2課-C++和C標準輸入輸出同步

為什么C和C的標準輸入輸出不同步時&#xff0c;數據會混亂&#xff1f;同步會帶來多大性能損失&#xff1f;為什么說這個損失通常不用太在乎&#xff1f; 0. 課堂視頻 C之“流”-第2課&#xff1a;和C輸入輸出的同步 1. 理解cin和cout的類型與創建過程 std::cout 是std::ostre…

Ubuntu系統Discover軟件中心簡介

Discover軟件中心是Ubuntu操作系統中默認的軟件管理工具&#xff0c;它提供了一個圖形用戶界面(GUI)來幫助用戶瀏覽、搜索、安裝和卸載軟件包。Discover軟件中心是Ubuntu軟件中心(Ubuntu Software Center)的繼承者&#xff0c;它在Ubuntu 16.04 LTS版本中首次被引入&#xff0c…

添加、修改和刪除字典元素

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 由于字典是可變序列&#xff0c;所以可以隨時在字典中添加“鍵-值對”。向字典中添加元素的語法格式如下&#xff1a; dictionary[key] value 參數…

You don‘t have enough free space或者no space left on device異常

1.磁盤空間不足 Linux安裝軟件顯示 You dont have enough free space 或者docker拉鏡像時&#xff0c;出現磁盤空間不足的情況 no space left on device 如果你是ubuntu系統。查看磁盤空間 df -h 多半是這個目錄滿了/dev/mapper/ubuntu--vg-ubuntu--lv 大多情況我們只希望擴…

學習編程對英語要求高嗎?

學習編程并不一定需要高深的英語水平。我這里有一套編程入門教程&#xff0c;不僅包含了詳細的視頻講解&#xff0c;項目實戰。如果你渴望學習編程&#xff0c;不妨點個關注&#xff0c;給個評論222&#xff0c;私信22&#xff0c;我在后臺發給你。 雖然一些編程資源和文檔可能…

typora自動生成標題序號(修改V1.0)

目錄 帶序號效果圖 解決方法 帶序號效果圖 解決方法 1.進入文件夾&#xff1a;文件–>偏好設置–>外觀–>主題–>打開主題文件夾 2.如果沒有base.user.css文件&#xff0c;新建一個。如果有直接用記事本打開&#xff0c;把下面代碼拷貝進去保存。 /** initiali…

【JUC編程】-多線程和CompletableFuture的使用

多線程編程 文章目錄 多線程編程[toc]引言創建多線程的方式繼承Thread類實現Runnable接口實現Callable接口Callable和Runnable的區別 Lambda表達式 線程的實現原理Future&FutureTask具體使用submit方法Future到FutureTask類Future注意事項局限性 CompletionService引言使用…

第八大奇跡

目錄 題目描述 輸入描述 輸出描述 輸入輸出樣例 示例 輸入 輸出 運行限制 原題鏈接 代碼思路 題目描述 在一條 R 河流域&#xff0c;繁衍著一個古老的名族 Z。他們世代沿河而居&#xff0c;也在河邊發展出了璀璨的文明。 Z 族在 R 河沿岸修建了很多建筑&#xff0c…

java如何向數組中插入元素

java的數組是不可改變的&#xff0c;因此如果要向數組中插入新的元素&#xff0c;需要新建一個數組&#xff0c;新的數組元素個數減去老數組元素個數的差大于等于要插入新的元素數量。 假如說要插入一個數組元素&#xff0c;需要把新元素插入到中間&#xff0c;把新的數組分為…

Vue組件通訊?組件中通過 provide 來提供變量,然后在?組件中通過 inject 來注?變量例子

在Vue中&#xff0c;provide 和 inject 主要用于依賴注入&#xff0c;允許祖先組件向其所有子孫組件提供一個依賴&#xff0c;而不論組件層次有多深。這在開發高階插件/組件庫時特別有用。 以下是一個簡單的例子&#xff0c;演示了如何在父組件中使用 provide 提供變量&#x…

軟件測試面試題(八)

一&#xff1a;TestDirector有哪些功能&#xff0c;如何對軟件測試過程進行管理&#xff1f; 需求管理 定義測試范圍 定義需求樹 描述需求樹的功能點 測試計劃 定義測試目標和測試策略 分解應用程序&#xff0c;建立測試計劃樹 確定每個功能點的測試方法 將每個功能點連接…