1

我现在要做的是在我的生产服务器上初始化一个私有存储库到应用程序的 www 文件夹(例如:/var/www/app.com/web/),然后将它作为暂存存储库克隆到我的测试站点(例如: /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 版本是我的想法

4

2 回答 2

5

我的计划是否正确?

级联回购听起来很复杂,而且不正常。

考虑任何结帐您承诺的裸 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)。

于 2012-03-21T23:57:10.620 回答
2

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

当您推送到非裸仓库时,Git 不会更新工作副本,除非您通过定义一个post-update挂钩来帮助它,git reset --hard当推送到已签出分支时执行此操作,并禁用默认检查以防止推送到已签出分支(我没有不记得确切的选项,请查看git-config手册页)。

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

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

对于更大的设置,我将在单独的服务器上拥有一个裸存储库,并且该钩子将导致 agit pull在生产存储库上使用ssh trigger. 优点是您将无法从外部访问服务器上的中央存储库,因此可以更好地保护它。

于 2012-02-24T14:00:23.217 回答