【问题标题】:How to set up a git development environment when you're testing remotely远程测试时如何设置 git 开发环境
【发布时间】:2026-01-28 18:25:01
【问题描述】:

这似乎是一个愚蠢的问题,但我觉得我对 GIT 理解得相当好,但我似乎无法按照我的意愿设置我的开发环境。我要么错过了一些非常简单的东西,要么我做错了:)

我在我的服务器上初始化了一个裸 git repo,将它克隆到我的本地机器,提交我的文件并推送到源。然后,我在本地创建了三个分支(master、release、develop)并将它们全部发布到 origin。我打算让多个开发人员从开发分支中拉出,我想确保他们不能推送到主分支,但这对于不同的问题可能会更好。

现在,我在本地对文件进行更改,然后将它们上传到测试服务器并通过 Web 浏览器检查测试服务器。我不得不想象这是大多数人测试他们工作的方式,除非他们将计算机配置为 Web 服务器并安装了 php 和 mysql。一旦我对我的更改感到满意,我就会将它们推送到原始存储库,一切正常。

我的挑战在于保持测试服务器与我的本地机器同步。我已经尝试在我的远程测试目录中设置一个 repo,并且我已经向我的本地 git repo 添加了第二个远程,希望我可以推送到测试 repo 以将测试服务器上的文件与我的本地文件同步。但我不知道如何拥有两个遥控器并使它们与我的本地机器保持同步。

如果我创建一个新的本地分支,检查它以开始开发新功能,然后将分支推送到我的测试远程,测试远程的头仍然是 master 而不是我的新功能分支。因此,我在本地对功能分支进行更改,但是当我通过 coda 将更改发布到测试服务器时,我实际上是在更改测试存储库的主分支上的文件。如果我不能让我的测试快照与我的本地快照保持同步,我就不知道如何充分利用 gits 分支功能。

我在本地开发和测试真的那么重要吗?当您必须进行远程测试时,究竟如何使用 git 设置开发环境?有一个测试回购是完全错误的思考方式吗?必须有一种方法来拥有多个远程并让它们签出到推送的最新分支,以便您可以在测试服务器上远程同步本地文件的实例。请帮忙!

【问题讨论】:

  • 尝试将您的测试运行添加到git post-commit,但请记住将其标记为可执行...让我知道这是否有帮助...
  • 不要使用 Git 进行部署,也绝对不要推送到非裸仓库进行测试。您应该肯定在本地进行开发(是的,大多数 PHP 开发人员都有本地 PHP/Apache/MySQL 实例)。对于部署,使用 Capistrano 之类的工具,您的生活会变得更加轻松。
  • "但是对于不同的问题可能会更好" -> 对于这部分,您可能需要阅读How to avoid merging changes into the production branch

标签: git git-branch git-remote


【解决方案1】:

最好在本地测试。您可以通过这种方式更快地迭代。快速迭代非常重要。你花在 git 推送和远程连接延迟上的时间加起来,比设置一个完整的本地开发环境要花费更多。

无论哪种方式,在某些时候,您都需要远程测试您的更改。您可以使用测试服务器上的 post-receive 挂钩来做到这一点。这是一种方法。

在测试服务器上:

  1. 为您的存储库创建一个裸克隆。让我们将此存储库称为“测试”。
  2. 从测试中克隆,并将其设置为您在浏览器中测试的远程网站
  3. 在测试存储库中创建一个接收后挂钩,它将从新接收的分支更新网站

post 接收钩子脚本:

#!/bin/sh
while read oldrev newrev refname
do
    upgrade_sh=./upgrade.sh
    if test -e $upgrade_sh; then
        upgrade_sh=$(readlink $upgrade_sh || echo $upgrade_sh)
        echo calling upgrade script: $upgrade_sh
        $upgrade_sh $refname
    else
        echo NOT calling non-existent upgrade script: $upgrade_sh
    fi
done

放入.git/hooks的测试,并使其可执行。

我通常将upgrade.sh 脚本保存在我的项目中并受版本控制,并从hooks 目录创建指向它的符号链接。升级脚本的upgrade.sh主要工作是将部署目录重置为您推送的分支:

#!/bin/sh -e
unset GIT_DIR
git checkout -f $1

在大多数情况下,您想做的不止于此,例如在我的 Django 网站上,我需要重新生成静态内容并向 Apache 发出重启信号。

我希望这可以帮助您入门。

【讨论】: