如何使用 post-receive 脚本从服务器自动执行 git pull 命令

How to execute git pull command automatically from server using post-receive script

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

中创建了 post-接收文件

GIT_WORK_TREE 是来自 bitbucket

的克隆回购

GIT_DIR 从 bitbucket 克隆的文件

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

使 post-receive 脚本可执行

这是一个示例 post-接收:-

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,但我得到的分支为空字符串。我希望输出是开发分支。

这是我在执行 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'

是不是我遗漏了什么或者我的设置不正确?

我在挂钩中看到了很多问题。您将 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