【问题标题】:Creating Git post-receive hook to post Tag name创建 Git post-receive 挂钩以发布标签名称
【发布时间】:2020-06-06 19:26:26
【问题描述】:

我有一个关于临时 Git 配置的问题。

我需要在标签帖子或任何提交上传递标签名称,例如

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    curl -X POST "https://en4c6i2k7daz5.x.pipedream.net/" \
        -H 'Content-Type: application/json' \
        -d '{"version": "$refname"}'            
done

我得到的结果(见https://requestbin.com/r/en4c6i2k7daz5/1cxY1mJeMlejAnF0OJ8B8iCd6sl

{"version": "$refname"}

所以由于某种原因它没有发送标签名称($refname 的值) - 脚本有什么问题?

【问题讨论】:

    标签: git hook git-post-receive


    【解决方案1】:

    您正在单引号引用您的数据,单引号的存在是为了关闭 shell 的字符串构造语法、扩展和分词等等。由于 refnames 中不能有空格或 glob 语法,我认为您可以在不引用它们的扩展的情况下通过,但为了安全起见,我通常会这样做,为了控制扩展,我通常会根据需要从单引号切换到双引号以获得那:

    -d '{"version": "'"$refname"'"}'
    

    或者你可以只用双引号并转义 json 的冗余引号以用这种方式强行插入它们:

    -d "{\"version\": \"$refname\"}"
    

    编辑:嗯,来自git help check-ref-format 我得到了

    这些规则使基于 shell 脚本的工具可以轻松解析引用名称,路径名扩展由 当引用名称未加引号(错误地)使用时的shell,并且还避免某些引用中的歧义 名称表达式(参见 gitrevisions(7)):

    即您保证根本不必引用 refname 扩展。

    【讨论】:

    • 谢谢,你拯救了我的一天!那真是菜鸟式的问题:)
    猜你喜欢
    • 2012-11-08
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多