我的计划是否正确?
级联回购听起来很复杂,而且不正常。
考虑任何结帐您承诺的裸 git 存储库的客户端/卫星/子级。您的登台和生产安装应该是特定分支的只读签出,您可能已经熟悉git-flow (因为几乎所有 git 问题都有指向它的链接 - 这个问题现在也不例外),这可能会深入了解如何设置您的分支机构,从而适当地结帐。
Git 服务器设置
本教程可能是您唯一需要遵循的教程。
请注意,如果您使用 home 设置 git 用户并在/home/git
其中创建 repo /home/git/project.git
,则意味着您不需要绝对路径。IE
(server) $ cd /home/git
(server) $ mkdir project.git
(server) $ cd project.git
(server) $ git --bare init
然后在任何你想要的地方:
(home) $ git clone git@server:project.git
当然,您也可以将您的 git 存储库放在任何您想要的位置,只需更改 git 用户的主目录(in /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)。