我一直将http://toroid.org/ams/git-website-howto作为在托管 VPS 上运行的生产 Web 服务器的起点。VPS 运行 cPanel 和 WHM,它最终将托管多个客户端网站,每个网站都有自己的 cPanel 帐户(因此,每个网站都有自己的 Linux 用户和提供站点的主目录)。每个客户的站点都是一个单独的 Git 存储库。
目前,我正在通过 SSH 将每个存储库推送到客户端主文件夹中的裸存储库,例如/home/username/git/repository.git/
. 根据上面的教程,每个 repo 都被配置为通过 post-receive 挂钩检出到另一个目录。在这种情况下,每个 repo 都签出自己/home/username/public_html
的文件(新 cPanel 帐户的默认 DocumentRoot),然后由 Apache 提供文件。虽然这可行,但它需要我设置(在我的本地开发环境中)我的遥控器,如下所示:
url = ssh://username@example.com/home/username/git/repository.git/
它还要求我每次推送时都输入用户密码,这不太理想。
为了将我的所有存储库集中在一个文件夹中,我还尝试以/root/git/repository.git
root 身份推送,然后从那里签出到适当的主目录。但是,这会导致所有签出的文件都归 root 所有,这会阻止 Apache 为该站点提供服务,并出现如下错误
[error] [client xx.xx.xx.xx] SoftException in Application.cpp:357: UID of script "/home/username/public_html/index.php" is smaller than min_uid
(据我所知,这是一个文件所有权/权限问题)
我可以在每个 repo 的 post-receive 钩子中使用 chown 和 chgrp 命令来解决这个问题——但是,这也会在我的脑海中引发“不太正确”的标志。我也考虑过 gitosis(将我的所有 repos 集中在 中/home/git/
),但我假设我会遇到相同的文件所有权问题,因为签出的文件将归 git 用户所有。
我只是以错误的方式处理这整个事情吗?我觉得我完全错过了对整个问题的第三种更优雅的解决方案。还是我应该坚持我上面描述的一种方法?