在生产服务器上初始化私有存储库

时间:2012-02-24 13:43:42

标签: git repository cvs git-branch dev-to-production

我现在要做的是将生产服务器上的私有存储库初始化到应用程序的www文件夹(例如:/var/www/app.com/web/),然后将其克隆为我的测试的暂存存储库site(例如:/var/www/test.com/web/app.com/)并最终从登台到本地克隆以使用代码。

我的计划是正确的吗?

我正在关注这些教程,以了解有关设置“git服务器”和初始化私有存储库的更多信息:

最后一个问题,这个关于成功的Git分支模型的教程将适用于哪里?在主私有存储库(生产服务器),本地或混合?我还没有读完,我会尽快完成。

编辑:

  • 如果重要,我正在尝试在运行ISPConfig配置的服务器上执行此操作。
  • 如果有一种“更健康”的方式,那就不是必须工作/如上所述......很高兴了解它。

http://www.howtoforge.com/the-perfect-subversion-server-debian-lenny-ispconfig-3和此http://www.howtoforge.com/installing-subversion-and-configuring-access-through-different-protocols-on-ubuntu-11.10到GIT版本是我有点想到的

2 个答案:

答案 0 :(得分:5)

  

我的计划是正确的吗?

级联回购听起来相当复杂,并且不正常。

考虑任何结账你正在承诺的裸git仓库的客户/卫星/子。您的暂存和生产安装应该是特定分支的只读签出,您可能已经熟悉了(因为几乎所有的git问题都可以获得它的链接 - 这个问题现在也不例外)git-flow可能会提供一些见解如何设置你的分支,从而适当地设置结帐。

Git服务器设置

This tutorial可能是您唯一需要关注的内容。

请注意,如果您使用/home/git的主页设置git用户并在/home/git/project.git创建一个repo,则表示您不需要绝对路径。即

(server) $ cd /home/git
(server) $ mkdir project.git
(server) $ cd project.git
(server) $ git --bare init

然后你想要的地方:

(home) $ git clone git@server:project.git

当然,您也可以将git repos放在任何地方,只需更改git用户的主目录(在/etc/passwd中)即可实现相同目的。

推送时更新

如果要在推送到存储库时更新结帐,则需要使用post-receive挂钩来执行此操作。首先正确设置自己:

(server) $ cd /var/www/app.com/web/
(server) $ git clone -b production-branch /home/git/project.git . # it's local - use a file path
(server) $ cd /var/www/test.com/web/app.com/
(server) $ git clone -b staging-branch /home/git/project.git .

然后使用

创建/home/git/project.git/hooks/post-update
cd /var/www/test.com/web/app.com
git --git-dir /var/www/test.com/web/app.com/.git pull #> /dev/null 2>&1 & #uncomment after testing

确保:

  • 钩子文件可由git
  • 执行并拥有
  • Git(也)与签出文件的所有者在同一组中,否则在推送时会出现权限错误

如上所述,每次按下时,命令的输出都会发送给你,这会使推慢(ish)。当您确定它可以正常工作时,您可以在后台运行它。每次推送都会引发分段结账并不重要 - 如果它指向的分支没有任何变化,它就不会做任何事情。

自动更新您的实时网站可能不是一个好主意。代替

(home) $ git checkout production-branch
(home) $ git merge staging-branch
(home) $ git push # updating production-branch
(home) $ git checkout feature/i-was-working-on-this
(home) $ ssh server 'cd /var/www/app.com/web/; git pull'
# Manual Post update checks

如果您自动执行此操作,例如更新使您的生产站点处于无法使用的状态 - 您可能不知道(除非您收到pingdom警告说“生产站点脱机”)。如果您拥有重要的测试覆盖率和自动部署流程,那么自动更新您的实时网站将是安全的 - 但在运行之前步行:)。

直接推送

如果你设置了

,你真的想要进入一个非裸露的结账
[receive]
    denyCurrentBranch = ignore

在项目的.git / config文件中,如果没有本地更改,也应该更新工作副本(iirc)。

答案 1 :(得分:2)

这是个好主意,但需要更多的工作。

当您推送到非裸机时,Git不会更新工作副本,除非您通过在推出检出分支时定义post-update hook来执行git reset --hard来帮助它,并禁用默认检查反对推送到签出分支(我不记得确切的选项,请查看git-config手册页。)

注意,执行git reset --hard将撤消任何本地修改。编写钩子以保留局部修改更棘手,但也可以完成。但是,您不应该在生产服务器上进行本地修改,对吧?

如果没有适当的挂钩,当您没有多台服务器时,这对于小型设置来说是非常明智的工作流程。

对于较大的设置,我在单独的服务器上有一个裸存储库,钩子会导致git pull使用ssh trigger在生产存储库上运行。优点是您可以从外部访问服务器上的中央存储库,从而可以更好地保护它。