git GIT_WORK_TREE post-receive hook部署远程

时间:2011-11-14 13:49:23

标签: git bash ssh

我正在尝试使用此收发后挂钩来更新我的实时服务器

GIT_WORK_TREE=/var/www/www.example.org git checkout -f

这个钩子位于远程裸仓库上,我希望实时工作树位于不同的服务器上。

如何进行此设置,以便在挂钩触发时将文件签出到实时服务器,是否从远程服务器ssh到实时服务器?我在哪里定义这个?

这是我正在尝试设置的内容

http://www.dejaaugustine.com/2011/05/leveraging-git-as-a-full-fledged-web-development-tool/

但是生活和测试位于不同的服务器上,而不是使用git pull我将使用git checkout -f

3 个答案:

答案 0 :(得分:3)

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

<强>假设

  • 您正在将代码推送到测试/临时服务器上的裸存储库(或者它可能只是托管“集中式”存储库的服务器)
  • 您想使用此裸仓库中的代码更新您的实时服务器
  • 您的实时服务器与您的存储服务器位于不同的服务器上

在实时服务器上:

  • 设置托管实时文件的非裸git仓库:cd /var/www/www.yoursite.com && git init
  • 从这个实时服务器,确保您使用ssh-keys(此处未涵盖)对您的裸存储库所在的服务器进行ssh访问。
  • 添加“集中”回购:git remote add origin git@testserverip:/path/to/repo.git
  • 现在,每次要更新实时服务器代码库时,都可以运行git fetch origin,然后运行git merge

由于这是一个实时服务器,因此通常不希望任何合并冲突导致麻烦。如果您不关心在实时服务器上丢失更改(因为您可能永远不会更改实时服务器上的任何重要内容),您可以使用git merge -m 'Overwriting live server' -s recursive -X theirs origin/active-branch-on-live-server

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

如果您希望此设置更自动,请在实时服务器上创建一个bash脚本:

git fetch origin
git merge -m 'Overwriting live server' -s recursive -X theirs origin/active-branch-on-live-server

将此脚本设为可执行的bash脚本(此处未介绍)。现在,您可以从“集中式”服务器上的钩子脚本调用此脚本,以便每次推送代码时实时服务器都会更新。

在“集中式”repo / test / staging服务器上:

(如果没有设置,你应该已经设置了一个裸仓库。)

在你的bare-repo.git / hooks / create / edit post-receive文件中,以便当代码被推送到裸仓库时,实时服务器运行上面创建的脚本:

#!/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

确保托管裸机库的服务器上的git用户可以通过ssh-key访问您的实时服务器,以便上面脚本中的ssh能够正常工作。

这是一个示意图概述。细节可以在其他地方找到:

答案 1 :(得分:0)

您必须更新收件后挂钩以从git服务器的checkout文件夹中获取文件并将其scp到您的实时服务器。

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

答案 2 :(得分:0)

您可以在实时/测试服务器上设置裸存储库,并使用主源存储库中的post-receive挂钩推送到它们。然后再次使用post-receive hook签出到web目录。

或者使用rsync作为主源存储库来实时/测试服务器。 (注意时滞。)