Skip to content

Git Hooks

· 3 min
TL;DR

Git 钩子

本文深入讲解 Git 钩子的工作原理及实际应用,包括 pre-receive、update 和 post-receive 三种服务端钩子的特点与用途。通过流程图和实例分析,展示了 Git 推送过程中钩子的触发顺序和环境变量的作用,为开发者提供自定义 Git 工作流的技术指南。

Git Hooks#

preview

默认钩子模板:

Terminal window
$ ls /usr/share/git-core/templates/
branches description hooks info

有一些比较重要的底层命令,如:

当我们在客户端执行 git push 时,客户端会执行 git send-pack,服务端会执行 git receive-pack

当在客户端执行 git pull/git fetch 时,客户端会执行 git fetch-pack,服务端会执行 git upload-pack。下面是 git push 的示例图,仅供参考:

sequenceDiagram
participant client
participant server
autonumber
Note over client: git push
rect rgba(0, 255, 255, .10)
client -->> + client: git send-pack
end
client ->> + server: send request
rect rgba(0, 255, 255, .10)
server -->> server: git receive-pack
end
server ->> client: neogotiate ok
client ->> server: send data
server ->> - client: done

pre-receive#

特点:

用途:

image-20210119000408230.png

update#

特点:

用途:

post-receive#

特点:

用途:

image-20210119000335045.png

实际推送时:

image-20210119001150753.png

image-20210119001501261.png

files-backend.c

image-20210413175201050.png

不同阶段 GIT 使用的环境变量不同:

image-20210626150633412.png

整个流程图见:https://www.processon.com/view/link/6075b4e8079129368880ce66

另外提一下 Git 的一些环境变量,这些环境变量在实际应用中比较有用:

环境变量#

GIT_TRACE_PACKET 追踪 pack 包的信息

GIT_CURL_VERBOSE 对于 clone http:// 有用

GIT_TRACE_BARE 能够去除多余的信息

GIT_TRACE_REFS 追踪引用信息 GIT_LFS_SKIP_SMUDGE 跳过 LFS 文件的下载