Git post-接收挂钩

Git post-recieve hook

我需要帮助编写 git post-接收挂钩。

我需要钩子来调用外部.exe文件并传入参数。

到目前为止,这是我的钩子:

#!/bin/sh

call_external()
{
     # --- Arguments
     oldrev=$(git rev-parse )
     newrev=$(git rev-parse )
     refname=""

     DIR="$(cd "$(dirname "[=12=]")" && pwd)"

     $DIR/post-receive.d/External.exe
 }

 # --- Main loop


while read oldrev newrev refname
do
    call_external  $oldrev $newrev $refname 
done

它工作得很好,除了我需要将一些参数传递给那个 exe,我不知道如何从 Git.

中获取它们

感谢'phd'更新如下: 我在 push

中每次提交都需要这些参数

我不知道如何从 GIT 获取此信息。

编辑(2021-04-22) 多亏了'phd'我才能够整理

#!/bin/sh
call_external()
{
    # --- Arguments
    oldrev=$(git rev-parse )
    newrev=$(git rev-parse )
    refname=""
    
    if [ $(git rev-parse --is-bare-repository) = true ]
    then
        REPOSITORY_BASENAME=$(basename "$PWD") 
    else
        REPOSITORY_BASENAME=$(basename $(readlink -nf "$PWD"/..))
    fi
    
    DIR="$(cd "$(dirname "[=13=]")" && 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

I need these parameters per every commit in the push

Commit hash

运行 以下循环:

git rev-list oldrev..newrev | while read hash; do echo $hash; done

循环内部 $hash 是一次提交的哈希值。

Author/Email

那是 git show --format="%an" -sgit show --format="%ae" -s%an 表示“作者姓名”,%ae — “作者邮箱”。请参阅 https://git-scm.com/docs/git-show#_pretty_formats

处的占位符列表
Commit description

git show --format="%B" -s。那是“提交消息的完整主体”。可以拆分成%s%b.

Branch name

你不需要循环使用它,你总是有它。 post-receive 钩子在更新引用时被调用,引用就是分支。 refname 在你的脚本中。

让我将所有这些组合成一个循环:

git rev-list oldrev..newrev |
while read hash; do
    echo Commit hash: $hash
    echo Author name: git show --format="%an" -s
    echo Author email: git show --format="%ae" -s
    echo Commit message: git show --format="%B" -s
done