我现在要做的是将生产服务器上的私有存储库初始化到应用程序的www文件夹(例如:/var/www/app.com/web/),然后将其克隆为我的测试的暂存存储库site(例如:/var/www/test.com/web/app.com/)并最终从登台到本地克隆以使用代码。
我的计划是正确的吗?
我正在关注这些教程,以了解有关设置“git服务器”和初始化私有存储库的更多信息:
最后一个问题,这个关于成功的Git分支模型的教程将适用于哪里?在主私有存储库(生产服务器),本地或混合?我还没有读完,我会尽快完成。
编辑:
此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版本是我有点想到的
答案 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-updatecd /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
确保:
如上所述,每次按下时,命令的输出都会发送给你,这会使推慢(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
在生产存储库上运行。优点是您可以从外部访问服务器上的中央存储库,从而可以更好地保护它。