Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用git作为部署工具_Git_Bash_Deployment - Fatal编程技术网

使用git作为部署工具

使用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/

我正试图使用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/${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选项克隆的。不使用此选项再次克隆以获得正常的“工作目录”副本,就像您在本地所做的那样

所以你现在应该有:

  • 您的本地存储库
  • 服务器上的裸存储库
  • 服务器上的普通服务器(从裸服务器克隆)
考虑到这一点,您现在可以创建一个post-receive钩子,每当有东西被推送到裸存储库时,它就会运行。Hooks(在服务器上)位于bare repo的Hooks文件夹中(其中有用于各种情况的示例)


此脚本专门查找主分支的推送,但可以轻松地将其更改为另一个分支或完全删除。然后,它切换到签出存储库的工作目录并执行拉操作。拉取完成后,您可以运行任何其他有用的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