讲师中心 微信公众号
AI工具推荐 视频效率加速

C# Git钩子脚本文件 C#如何编写用于Git事件的C#脚本(pre-commit, post-receive)

秋枫君_1097

秋枫君_1097

发布时间:2026-02-26 10:25:17

|

165人浏览过

|

来源于php中文网

原创

Git钩子本质是可执行文件,C#程序需通过shell脚本调用或发布为自包含.exe;pre-commit须快速响应,post-receive需从stdin读取并指定--git-dir;跨平台钩子应统一用shell封装并区分路径与输出流。

c# git钩子脚本文件 c#如何编写用于git事件的c#脚本(pre-commit, post-receive)

Git钩子不是C#运行环境,得靠外部可执行程序启动

Git钩子本质是 shell 脚本或任意可执行文件,只要它在对应钩子目录下、有执行权限、且返回 0(成功)或非 0(拒绝操作),Git 就认。C# 编译出来的 dotnet 程序或 .exe 本身不能直接当钩子——因为 Git 不会调用 dotnet 去跑你写的 PreCommit.dll。

所以实际做法只有两种:

  • 写一个 shell 脚本(.sh 或 .bat),里面调用 dotnet run 或 dotnet exec 启动你的 C# 工具
  • 发布为自包含(self-contained)的 .exe,然后让钩子文件直接 exec 它(Windows 下可直接用 .exe;Linux/macOS 需确保有执行权限且 #!/usr/bin/env ./MyHook 这类 shebang 不生效,得靠 shell 中转)

常见错误:把 Program.cs 直接丢进 .git/hooks/pre-commit,然后发现 Git 完全没反应——因为它不是可执行文件,也不符合 shebang 规范。

pre-commit 钩子必须快,C# 启动开销容易超时

pre-commit 在用户敲下 git commit 后立刻执行,阻塞提交流程。如果 C# 程序要加载 .NET Runtime、JIT、再读配置、扫描文件……很容易卡住几秒,用户会觉得 Git “卡死” 或直接 Ctrl+C 中断,导致钩子被跳过。

实操建议:

Git Factory
Git Factory

为每个编码任务配置并管理独立的 Git worktree,支持并行分支和清晰的 PR 工作流,避免合并冲突。

下载
  • 优先用 dotnet publish -r win-x64 --self-contained true(或对应平台)生成原生 .exe,避免依赖目标机器装 SDK/Runtime
  • 入口逻辑尽量早 return:比如先检查是否在允许跳过的分支(git rev-parse --abbrev-ref HEAD)、是否有 --no-verify 参数
  • 避免在钩子里做耗时操作:如完整编译、NuGet restore、网络请求。静态分析能用 dotnet format --dry-run 或 dotnet build -nologo -warnaserror 就别自己重写
  • 加简单日志输出到 stderr(Console.Error.WriteLine),方便调试时看到卡在哪一步

post-receive 钩子运行在服务端,C# 程序需处理裸仓库路径和 stdin

不同于本地钩子,post-receive 运行在 Git 服务端(如 bare repo),没有工作区,所有信息通过 stdin 传入三元组:<oldref><newref><refname></refname></newref></oldref>。C# 程序必须自己读取 stdin 并解析,不能假设当前目录是项目根。

关键点:

  • stdin 是唯一输入源,必须用 Console.In.ReadToEnd() 或逐行读取,不能依赖 Environment.CurrentDirectory
  • 裸仓库路径由 Git 通过环境变量提供:GIT_DIR(通常是 /path/to/repo.git),但工作区不存在,所以 git checkout 类操作无效;想查文件内容得用 git show 或 git archive
  • C# 程序若需执行 Git 命令,必须显式指定 --git-dir 和(必要时)--work-tree,例如:git --git-dir=/var/git/myrepo.git log -1 --format=%H HEAD
  • 权限问题:服务端运行用户(如 git 用户)可能无权访问你的 C# 程序路径或写日志文件,建议用绝对路径 + /tmp 或 /var/log 下预授权目录

跨平台钩子脚本里别硬编码 .exe 或 dotnet 路径

一个 pre-commit 钩子要在 Windows 开发者、macOS CI、Linux 服务器上都跑通,就不能写死 ./MyHook.exe 或 dotnet ./MyHook.dll。

推荐方案:

  • 钩子文件统一用 shell(#!/bin/sh),开头检测平台:uname -s 判断是 Darwin/Linux/MSYS*,再决定调用 ./MyHook 还是 ./MyHook.exe
  • 不依赖全局 dotnet:self-contained 发布后,直接执行二进制,不碰 dotnet 命令。否则 CI 里没装 SDK 就直接失败
  • 路径用 $(dirname "$0")/.. 相对定位,别用 pwd——钩子执行时工作目录是 Git 根,但脚本位置固定在 .git/hooks/
  • 加兜底错误处理:比如 if ! command -v ./MyHook >/dev/null 2>&1; then echo "MyHook missing" >&2; exit 1; fi

最容易被忽略的是 stdin/stderr 重定向行为:Git 钩子默认把 stdout 接管用于显示提示,但 C# 的 Console.WriteLine 输出会被 Git 当作提交说明的一部分(尤其在 pre-commit),所以诊断信息一律走 Console.Error.WriteLine,别混用。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1749

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1211

2024.06.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

989

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2960

2023.10.25

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

856

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

6283

2024.05.29

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
vscode手册
vscode手册

共0课时 | 0人学习

Git 教程
Git 教程

共21课时 | 8.1万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn