git git_WORK_TREE post接收钩子部署远程

git git_WORK_TREE post接收钩子部署远程,git,bash,ssh,Git,Bash,Ssh,我正在尝试使用此post recieve钩子更新我的live服务器 GIT\u WORK\u TREE=/var/www/www.example.org GIT checkout-f 这个钩子位于远程裸repo上,我希望live work树位于不同的服务器上 我如何设置它,以便当钩子启动时,它将文件签出到live server,它是否从远程服务器ssh到live server?我在哪里定义这个 这是我想要设置的 但是live和test在单独的服务器上运行,而不是使用git pull,我打算使用

我正在尝试使用此post recieve钩子更新我的live服务器

GIT\u WORK\u TREE=/var/www/www.example.org GIT checkout-f

这个钩子位于远程裸repo上,我希望live work树位于不同的服务器上

我如何设置它,以便当钩子启动时,它将文件签出到live server,它是否从远程服务器ssh到live server?我在哪里定义这个

这是我想要设置的


但是live和test在单独的服务器上运行,而不是使用git pull,我打算使用
git checkout-f

您必须更新post receive钩子,以便从git服务器中的checkout文件夹获取文件,并将其scp到live服务器

GIT_WORK_TREE=/home/temp git checkout -f
scp -r /home/temp user@liveserver:/var/www/www.example.org

您可以在live/test服务器上设置一个裸存储库,并使用来自主源存储库的post receive钩子推送到它们。然后再次使用post接收钩子签出到web目录


或者对主源存储库使用rsync来运行/测试服务器。(注意时间延迟。)

以下解决方案使用来自另一台服务器上的裸回购的代码更新实时服务器代码库。此解决方案不使用scp或复制文件在live server上进行覆盖,因为我们希望避免覆盖整个目录(使用git,我们可以选择要更新的内容)

假设

  • 您正在将代码推送到测试/登台服务器上的裸存储库(或者它可能只是承载“集中式”repo的服务器)
  • 您希望使用此裸机repo中的代码更新live server
  • 您的实时服务器与裸repo服务器位于不同的服务器上
在实时服务器上:

  • 设置托管实时文件的非裸git回购:
    cd/var/www/www.yoursite.com&&git init
  • 从这个实时服务器,确保您可以使用ssh密钥(此处未介绍)通过ssh访问裸存储库所在的服务器
  • 添加“集中式”repo:
    git远程添加源git@testserverip:/path/to/repo.git
  • 现在,每次要更新live server代码库时,都可以运行
    git fetch origin
    ,然后运行
    git merge
由于这是一个实时服务器,您通常不希望任何合并冲突造成问题。如果您不在乎丢失对live server的更改(因为您可能永远不会更改live server上的任何重要内容),则可以使用
git merge-m'Overwriting live server'-s recursive-X live server上的源/活动分支

典型的情况是,您在live server上有其他不想覆盖的文件(临时文件、用户更改的文件等)。确保将所有这些文件/目录添加到.gitignore文件中,并确保它们不是由git add添加的。这样,当从您的集中回购中提取代码时,它们不会受到影响

如果希望此设置更加自动化,请在live server上生成bash脚本:

git fetch origin
git merge -m 'Overwriting live server' -s recursive -X theirs origin/active-branch-on-live-server
将此脚本作为可执行的bash脚本(此处未介绍)。现在,您可以从“集中式”服务器上的钩子脚本调用此脚本,以便在每次推送代码时更新实时服务器

在“集中式”回购/测试/登台服务器上:

(如果没有创建,您应该已经在此处设置了裸回购协议)

在您的bare-repo.git/hooks/创建/编辑
post receive
文件中,以便live server在将代码推送到bare repo时运行上面创建的脚本:

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)

    # Use this if-sentence to only update live server if branch is the wanted branch, e.g. master or stable
    if [[ "stable" == "$branch" ]]; then
            # Fetch this branch from live-server
            ssh root@ip-to-live-server '/path/to/script-created-above'
    fi
done
确保托管裸repo的服务器上的git用户可以通过ssh密钥访问您的实时服务器,以便上面脚本中的ssh能够工作

这是一个示意图概述。详情可在其他地方找到:

  • 关于覆盖实时服务器上的文件:
  • 使用gitignore:
  • 使用接收后钩子脚本对给定分支作出反应: