我正在尝试使用此收发后挂钩来更新我的实时服务器
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
。
答案 0 :(得分:3)
以下解决方案使用另一台服务器上的裸仓库中的代码更新实时服务器代码库。此解决方案不使用scp或复制文件覆盖实时服务器,因为我们希望避免覆盖整个目录(使用git我们可以选择我们想要更新的内容)。
<强>假设强>:
在实时服务器上:
cd /var/www/www.yoursite.com && git init
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作为主源存储库来实时/测试服务器。 (注意时滞。)