代码之家  ›  专栏  ›  技术社区  ›  takeshin

git:post-receive hook中的空参数

  •  13
  • takeshin  · 技术社区  · 15 年前

    我正在写基于 post-receive-email 脚本 contrib 但是看起来 oldrev newrev 参数为空。

    脚本如下:

    #!/bin/bash
    
    oldrev=$(git rev-parse $1)
    newrev=$(git rev-parse $2)
    

    脚本在push上运行,但全部 $1 , $2 , $oldrev $newrev 是空的。我应该配置一些东西来运行它吗?

    (存储库是由 gitolite 如果有关系的话)

    5 回复  |  直到 10 年前
        1
  •  10
  •   Jörg W Mittag    15 年前

    这个 post-receive hook不接受任何参数。夸特 the manual (增加了重点):

    这个钩子由远程存储库上的git receive pack调用,当在本地存储库上执行git push时就会发生这种情况。在更新了所有引用之后,它会在远程存储库上执行一次。

    这个钩子为接收操作执行一次。 它不需要争论 但得到的信息与 pre-receive 钩子按其标准输入执行。

    这个钩子不会影响 git-receive-pack 在真正的工作完成后,它被称为。

    这将取代 post-update 钩住它,它得到所有引用的新旧值以及它们的名称。

    标准输出和标准错误输出都转发到 git send-pack 在另一端,您可以简单地为用户回送消息。

    默认值 邮政收货 钩子为空,但有一个示例脚本 post-receive-email 提供在 contrib/hooks Git发行版中的目录,用于发送提交电子邮件。

        2
  •  51
  •   François    15 年前

    我在设置持续集成服务器时遇到了这个问题。由于参数没有通过命令行传递给post-receive,因此必须使用read命令。我是这样做的:

    #!/bin/sh
    read oldrev newrev refname
    BRANCH=${refname#refs/heads/} 
    curl --request POST "http://my.ci.server/hooks/build/myproject_$BRANCH"
    
        3
  •  9
  •   estani    13 年前

    尽管信息通过stdin传递,但没有参数。要从bash中读取这些信息,只需执行以下操作:

    read oldrev newrev refname
    echo "Old revision: $oldrev"
    echo "New revision: $newrev"
    echo "Reference name: $refname"
    

    我只是在总结已经发布的答案。

        4
  •  3
  •   lifeisfoo    10 年前

    一个更详细的版本的fran_ois脚本将是

    #!/bin/bash
    
    JENKINS_URL="http://192.168.1.116/jenkins"
    GIT_URL="git@bitbucket.org:nuclos/nuclos.git"
    
    # remove all spaces and newlines from ARG
    trim() {
      local ARG="$1"
      shift
      echo -e "$ARG" | tr -d "[:space:]\n" 
    }
    
    # unique sort ARG items separated by newlines
    unique() {
      local ARG="$1"
      shift
      echo -e "$ARG" | sort -u -i
    }
    
    # cut first and last character from ARG
    cutfl() {
      local ARG="$1"
      shift
      local LEN="${#ARG}"
      let LEN="$LEN - 2"
      echo "${ARG:1:$LEN}"
    }
    BRANCHES=""
    while read oldrev newrev refname; do
      BRANCH=`trim ${refname#refs/heads/}`
      if [ -n "$BRANCH" ]; then
        BRANCHES+="${BRANCH}\n"
      fi
    done
    
    BRANCHES=`unique "$BRANCHES" | tr '\n' ','`
    BRANCHES=`cutfl "$BRANCHES"`
    echo wget -q -O - "$JENKINS_URL/git/notifyCommit?url=$GIT_URL&branches=$BRANCHES"
    at "now + 5 minutes" <<END
    wget -q -O - "$JENKINS_URL/git/notifyCommit?url=$GIT_URL&branches=$BRANCHES"
    END
    

    这个版本可以处理多个分支,并且只为每个分支触发一个构建。

        5
  •  1
  •   Dennis philip brodovsky    15 年前

    实际上,我不接受“它不接受任何参数”,因为示例脚本post-receive.sample有以下注释:

    # The "post-receive" script is run after receive-pack has accepted a pack
    # and the repository has been updated.  It is passed arguments in through
    # stdin in the form
    #  <oldrev> <newrev> <refname>
    # For example:
    #  aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
    
    推荐文章