如何使用接收后脚本从服务器自动执行git pull命令

时间:2019-08-03 05:34:08

标签: git bitbucket git-flow

我在bitbucket服务器中存储了一个工作树,并启用了git-flow。我有2个分支,分别是develop(分段)和master(生产)。登台和生产存储在不同的服务器中。当我将文件推送到git pull分支时,我想在服务器上自动执行develop命令。我已经在/var/www/test-dev/.git/hooks中创建了接收后文件。

GIT_WORK_TREE是bitbucket的克隆存储库

GIT_DIR从bitbucket克隆的文件

我尝试从本地提交,并将其推送到bitbucket,从本地提取更新的文件,但后脚本似乎无法正常工作。我还通过运行命令chmod u+x post-receive使接收后脚本可执行。

以下是接收后的示例:-

GIT_WORK_TREE="git@bitbucket.org:username/test.git"
GIT_DIR="/var/www/test-dev"
DEPLOY_ALLOWED_BRANCH="develop"

echo "***** GIT_DIR: $GIT_DIR"
echo "***** GIT_WORK_TREE: $GIT_WORK_TREE"

while read oldrev newrev refname
do

    BRANCH=$(git rev-parse --symbolic --abbrev-ref $refname)
    NEWREV="$newrev"

    if [ "$DEPLOY_ALLOWED_BRANCH" == "$BRANCH" ]; then
        git checkout -f "${BRANCH}" || exit 1
        git reset --hard "$NEWREV" || exit 1
    fi

    echo "githook: Will deploy '${BRANCH}' branch to the project '${GIT_DIR}'"
done

exit 0

我尝试手动执行post-receive,但是我正在获取用于分支的空字符串。我希望输出将是开发分支。

这是我执行接收后的消息

***** GIT_DIR: /var/www/test-dev
***** GIT_WORK_TREE: git@bitbucket.org:username/test.git

githook: Will deploy '' branch to the project '/var/www/test-dev'

是否缺少某些内容或设置不正确?

1 个答案:

答案 0 :(得分:2)

我看到很多问题。您将GIT_WORK_TREE设置为远程URL;它必须是本地目录的路径。 GIT_DIR必须指向.git目录或上一级目录。

您在脚本的开始处设置了GIT_WORK_TREEGIT_DIR,因此每个git命令都使用这些设置运行,即使是那些需要访问原始存储库的命令也是如此。让我尝试用这种方式重写脚本:

DEPLOY_ALLOWED_BRANCH="develop"

while read oldrev newrev refname
do

    BRANCH=$(git rev-parse --symbolic --abbrev-ref $refname)
    NEWREV="$newrev"

    if [ "$DEPLOY_ALLOWED_BRANCH" == "$BRANCH" ]; then
        GIT_WORK_TREE="/var/www/test-dev"
        GIT_DIR="/var/www/test-dev/.git"

        echo "***** GIT_DIR: $GIT_DIR"
        echo "***** GIT_WORK_TREE: $GIT_WORK_TREE"

        echo "githook: Will deploy branch '${BRANCH}' to the project '${GIT_DIR}'"

        git checkout -f "${BRANCH}" || exit 1
        git reset --hard "$NEWREV" || exit 1

        exit 0
    fi
done