如何使用 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_TREE
和 GIT_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
我在 bitbucket 服务器中存储了一个工作树,它启用了 git-flow。我有 2 个分支,它们是 develop
(暂存)和 master
(生产)。暂存和生产存储在不同的服务器中。当我将文件推送到 develop
分支时,我想在服务器上自动执行 git pull
命令。我在 /var/www/test-dev/.git/hooks
.
GIT_WORK_TREE
是来自 bitbucket
GIT_DIR
从 bitbucket 克隆的文件
我尝试从本地提交并将其推送到 bitbucket,从本地提取更新的文件,但 post-脚本似乎无法正常工作。我还通过 运行 命令 chmod u+x 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_TREE
和 GIT_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