使用git作为部署工具
我正试图使用git作为部署工具,因此,当推送到生产分支时,我希望相应地更新远程服务器。然而,当我运行第二个命令(pull)时,它返回一个错误,即使用git作为部署工具,git,bash,deployment,Git,Bash,Deployment,我正试图使用git作为部署工具,因此,当推送到生产分支时,我希望相应地更新远程服务器。然而,当我运行第二个命令(pull)时,它返回一个错误,即操作必须在工作树中运行。有人能给我指出正确的方向吗 下面是bash脚本的部分示例 echo -e "Thank you for pushing your changes to ${project}. \nHold on while I update the required directories..." GIT_WORK_TREE=/home/www/
操作必须在工作树中运行。
有人能给我指出正确的方向吗
下面是bash脚本的部分示例
echo -e "Thank you for pushing your changes to ${project}. \nHold on while I update the required directories..."
GIT_WORK_TREE=/home/www/${project} git checkout -f
echo "Local directory updated!"
for ref in $@; do
echo $ref
if [ "$ref" = "refs/heads/production" ]; then
# Before we could set the GIT directory strictly from the local environment
# but the case might not be the same remotely. Need absolute paths.
ssh git@myserver GIT_DIR=/home/www/${project}/.git GIT_WORK_TREE=/home/www/${project} git checkout -f production
ssh git@myserver.com GIT_DIR=/home/www/${project}/.git GIT_WORK_TREE=/home/www/${project} git pull -f production
echo "Production push completed"
fi
done
编辑:
以下是复制粘贴错误:
<代码:远程:致命:/UR/LB/Git核心/Git拉不得没有工作树使用。< /代码>
< P>听起来好像你认为“部署”是一个裸露的存储库。您应该在不使用--bare的情况下克隆repo,然后重试。正如@meagar所说,远程服务器上的克隆存储库似乎是使用--bare选项克隆的。不使用此选项再次克隆以获得正常的“工作目录”副本,就像您在本地所做的那样 所以你现在应该有:- 您的本地存储库
- 服务器上的裸存储库
- 服务器上的普通服务器(从裸服务器克隆)
此脚本专门查找主分支的推送,但可以轻松地将其更改为另一个分支或完全删除。然后,它切换到签出存储库的工作目录并执行拉操作。拉取完成后,您可以运行任何其他有用的bash命令。您应该查看而不是滚动自己的部署脚本。Git不是一个部署工具,尽管有足够的脚本,它可以这样工作。请看,maegar是对的,它需要是非裸的(通常不应该是主要的上游服务器副本,而应该是您专门推送到的repo)。Ghickman--我在远程执行此操作,我是否应该在SSH调用的一行中添加所有这些命令?@hwrdprkns-不,在/hooks/post-receive中(确保它具有执行权限)。正如我在回答中所说,当您从本地签出推送到裸存储库时,会自动运行post receive钩子,因此每次推送时,它都会更新服务器的签出副本。我认为您没有正确理解我的意思--这是我的工作流示例:在post receive钩子更新时本地提交-->推送到裸存储-->远程生产服务器上的e(关键字)repo。您的脚本似乎更新了本地服务器上的存储库(w.r.t裸repo)@hwrdprkns-对不起,您的裸机回购不在远程服务器上吗?这是使用裸机回购的一种相当标准的方式,所以我刚才假设这就是您的意思!将裸机回购放在远程服务器上肯定会容易得多。
#!/bin/bash
while read oldrev newrev refname
do
if [ "$refname" == "refs/heads/master" ]; then
WORKDIR=/path/to/checked/out/repository
export GIT_DIR=$WORKDIR/.git
pushd $WORKDIR >/dev/null
git pull --quiet >/dev/null
# run some scripts in the checked out repository
popd >/dev/null
fi
done