Git pre-receive钩子无法获取传入参数,生成文件为空如何解决?
问题原因
pre-receive 钩子的参数传递逻辑和你理解的不一致,这类服务端接收钩子不会通过命令行位置参数($1、$2、$3)传递提交数据,所有推送的引用更新信息都是通过标准输入流传入的。
一次推送可能包含多个分支、标签的更新,每个更新对应标准输入中的一行,每行按空格分割后依次对应:旧版本哈希、新版本哈希、引用的完整路径。
修复后的钩子代码
把你的pre-receive脚本内容替换为以下内容即可:
#!/bin/bash -p # 逐行读取标准输入的引用更新数据 while read old_hash new_hash ref; do echo "$old_hash" > pre-receive-old-hash.txt echo "$new_hash" > pre-receive-new-hash.txt echo "$ref" > pre-receive-ref.txt done exit 1
额外注意事项
- 若你单次推送包含多个分支/标签的更新,上述写法只会保留最后一个更新的信息,有存储全量数据需求可以调整逻辑写入多份文件或者拼接内容。
- 裸仓库没有工作目录,生成的
pre-receive-*.txt默认会存储在裸仓库的根目录,而非hooks子目录中,找不到文件可优先去根目录查找。
内容的提问来源于stack exchange,提问作者Omroth
相关产品推荐
相关产品推荐

