首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >git GIT_WORK_TREE接收后挂钩部署远程

git GIT_WORK_TREE接收后挂钩部署远程
EN

Stack Overflow用户
提问于 2011-11-14 21:49:23
回答 3查看 4.8K关注 0票数 4

我正在尝试使用这个接收后钩子来更新我的实时服务器

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

EN

回答 3

Stack Overflow用户

发布于 2015-05-12 20:42:50

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

假设

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

位于不同的服务器上

实时服务器上的

集中设置托管实时文件的非裸git存储库:cd /var/www/www.yoursite.com && git init

  • From此实时服务器,确保您拥有对裸存储库所在服务器的ssh访问权限,使用ssh-

  • (此处不介绍)

  • 添加“集中式”存储库:git remote add origin git@testserverip:/path/to/repo.git

  • Now,每次您想要更新实时服务器代码库时,您都可以先运行git fetch origin,然后运行git merge

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

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

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

代码语言:javascript
复制
git fetch origin
git merge -m 'Overwriting live server' -s recursive -X theirs origin/active-branch-on-live-server

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

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

(您应该已经在这里设置了一个空的repo,如果没有创建它的话)。

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

代码语言:javascript
复制
#!/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正常工作。

这是一个示意性概述。详细信息可以在其他地方找到:

gitignore关于覆盖实时服务器上的文件:https://stackoverflow.com/a/10113231/1030104

票数 3
EN

Stack Overflow用户

发布于 2011-11-15 00:54:32

您必须更新您的post-receive钩子,以便从git服务器的签出文件夹中获取文件,并将其scp到您的实时服务器。

代码语言:javascript
复制
GIT_WORK_TREE=/home/temp git checkout -f
scp -r /home/temp user@liveserver:/var/www/www.example.org
票数 0
EN

Stack Overflow用户

发布于 2013-05-26 03:36:59

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8122543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档