【发布时间】:2026-01-10 07:15:02
【问题描述】:
我需要帮助来编写一个 git post-receive 钩子。
我需要 hook 来调用外部 .exe 文件并传入参数。
到目前为止,这是我的钩子:
#!/bin/sh
call_external()
{
# --- Arguments
oldrev=$(git rev-parse $1)
newrev=$(git rev-parse $2)
refname="$3"
DIR="$(cd "$(dirname "$0")" && pwd)"
$DIR/post-receive.d/External.exe
}
# --- Main loop
while read oldrev newrev refname
do
call_external $oldrev $newrev $refname
done
它工作得很好,除了我需要将一些参数传递给那个 exe,而且我不知道如何从 Git 中获取它们。
感谢 'phd' 更新: 我每次推送都需要这些参数
- 作者/电子邮件
- 提交哈希
- 提交说明
- 分公司名称
我不知道如何从 GIT 获取此信息。
编辑(2021-04-22) 多亏了“博士”,我才能拼凑起来
#!/bin/sh
call_external()
{
# --- Arguments
oldrev=$(git rev-parse $1)
newrev=$(git rev-parse $2)
refname="$3"
if [ $(git rev-parse --is-bare-repository) = true ]
then
REPOSITORY_BASENAME=$(basename "$PWD")
else
REPOSITORY_BASENAME=$(basename $(readlink -nf "$PWD"/..))
fi
DIR="$(cd "$(dirname "$0")" && pwd)"
BRANCH=$refname
git rev-list "$oldrev..$newrev"|
while read hash
do
COMMIT_HASH=$hash
AUTHOR_NAME=$(git show --format="%an" -s)
AUTHOR_EMAIL=$(git show --format="%ae" -s)
COMMIT_MESSAGE=$(git show --format="%B" -s)
$($DIR/post-receive.d/External.exe "$BRANCH" "$AUTHOR_NAME" "$AUTHOR_EMAIL" "$COMMIT_MESSAGE" "$COMMIT_HASH" "$REPOSITORY_BASENAME")
done
}
# --- Main loop
while read oldrev newrev refname
do
call_external $oldrev $newrev $refname
done
【问题讨论】:
-
"推动提交的人的电子邮件" 什么是提交?更新引用时调用钩子;
oldrev和newrev之间可能有一百个提交。 "提交编号#" 编号是多少?提交哈希? “描述/评论” 再说一遍,这是什么?提交消息? "Repository name" 你不能从 git 得到这个——它不存储存储库名称。可以从OS获取顶层目录的名称,仅此而已。