【问题标题】:Mercurial. Version control and deployment. Different config files. How to?水银。版本控制和部署。不同的配置文件。如何?
【发布时间】:2012-02-01 03:03:26
【问题描述】:

我有如下设置。

位于 bitbucket 的私有存储库,我在其中保存“主”存储库。 我服务器上的一个存储库,充当“实时”网站。 我笔记本电脑上的一个存储库,用作我的工作副本。

我的流程如下。我对本地存储库中的文件进行了更改。我在本地提交这些。我将这些更改推送到 bitbucket。然后,我将这些更改从我的 bitbucket 拉到网络服务器。

但是我遇到的问题是我的本地副本对数据库、路径等使用了不同的配置设置,因此我想要的是我在 bitbucket 中的“config.php”文件以包含服务器设置,以及 config.php我的本地主机包含本地设置。

我相信这可以通过 .hgignore 实现,但我没有成功研究。 我遇到的问题是我制作了服务器设置文件,将其推送到 bitbucket,在我的本地存储库中“忘记”该文件,创建一个 .hgignore,然后重新创建该文件。但是,当我“忘记”文件 TortoiseHG 并要求我将更改提交到 bitbucket....

任何想法将不胜感激。 谢谢

加分。

按照以下建议,我开发了如下设置:

我的笔记本电脑上有本地存储库,我可以在其中进行编辑。 我有 bitbucket,它本质上是“主”存储库——如果有其他开发人员加入团队,他们会克隆它。 我的虚拟主机上有我的实时存储库。

在我的实时存储库中,我有一个忽略相应配置文件的 .hgignore 文件。 因此,当我从主机执行 hg pull 时,它会按原样使用 localhost 配置文件提取存储库,但是当我键入 hg update(到实时工作副本)时,这些文件将被忽略/不更新。

有人可以澄清一下我是否正确理解了这一点,以及这是否是实现我想要的合适方式?

谢谢

【问题讨论】:

    标签: version-control mercurial tortoisehg bitbucket


    【解决方案1】:

    .hgignore 仅在文件尚未版本化时才会忽略文件,因此我认为您在问题中的想法不会奏效。

    关于本地配置的常用方法通常是同一主题的变体,例如以下之一:

    1. 根本不要签入config.php。您可以使用最常用的设置签入config.example.php,并在README 中记录用户必须将其复制到config.php 然后进行编辑。

    2. 将任何共享设置放入config.php,并添加一个包含语句以指向具有特定于机器设置的未版本控制文件,例如config.local.php。您也可以为此提供一个config.local.example.php-file。

    3. 类似于 2,但 config.php 包含所有默认设置,并且本地文件可以覆盖它们。

    4. 签入包含两个环境设置的config.dev.phpconfig.server.php-文件,然后拥有一个包含上述文件之一的未版本化config.php。优点是配置本身是版本化的,您可以更新它们。

    选择这些变体中的哪一个,或者您是否制作另一个变体,取决于您的环境。

    【讨论】:

    • 我所做的是使用 hg remove 删除克隆存储库中的配置文件,即我的“实时”副本。然后我在重新创建配置文件之前创建了 .hgignore 文件。我的理解是,当我现在更新时,由于 hgignore 它不会更新这些文件?所以如果我理解正确,我基本上实现了同样的事情,但没有版本化配置的好处......对吗?谢谢
    • 回复。忽略文件,听起来不错,您问题中的措辞使您似乎希望 .hgignore 可以处理已拉出(并因此进行版本控制)的文件,但是如果您先将其删除,它将被忽略。请注意,该文件可能会被拉取删除,因此您必须在拉取后恢复它,然后它才能工作。
    • 回复。选项,我认为您基本上做了选项 1 描述的操作,除了我建议您检查示例配置以使人们更容易配置。选项 1 具有未版本化配置(但只是一个示例),选项 2 和 3 具有部分版本化配置,选项 4 具有完全版本化配置。任何一种都很好,都有其优点和缺点,所以这取决于你想做什么。
    【解决方案2】:

    使用版本控制和不同配置文件的基本思想始终相同,但我对 PHP 的了解不够多,无法详细回答如何在 PHP 中执行此操作。
    几个月前,我为 .net/Visual Studio 回答了a similar question,所以我只会给你这个答案的链接,并尝试再次描述基本思想,但这次与语言无关:

    对于您的用例,基本想法是在存储库中有两个配置文件,一个包含您的本地数据,一个包含您的服务器数据,例如:

    config.local.php
    config.server.php
    

    “真正的”config.php 不在存储库中,它应该在.hgignore,所以它也永远不会在存储库中。

    拉取后,您需要运行将这些文件之一(“正确”的文件取决于当前环境、本地或服务器)复制到config.php

    而这最后一部分正是我无法详细回答的部分,因为我不知道如何在 PHP 和/或 Web 服务器上做到这一点,因为我是 .net/Windows伙计。
    据我所知,部署 PHP 站点只是在 Web 服务器上复制文件,因此没有“构建/编译”步骤可以完成配置文件的复制/重命名(我会在 .网)。如果我错了,请纠正我...


    编辑:

    Thomas,我不确定我是否正确理解了您的编辑。您笔记本电脑上的“本地”存储库和网络服务器上的“实时”存储库基​​本上是 Bitbucket 上“主”存储库的克隆,对吗?
    如果是,您是说在不同的克隆中有不同的.hgignore 文件吗?这就是让我感到困惑的部分。
    不管你最终是怎么做的(处理配置文件有几种可能,见下文),.hgignore 文件在你的存储库的所有克隆中都应该是相同的。

    因此,您的所有存储库(无论哪台机器上的哪个克隆)都应该包含相同的配置文件。
    然后,您只需要确保在不同的环境中使用不同的配置即可。在Lauren Holst's answer 中已经有一个很好的不同方法的列表来实现这一点,所以我会指出你那里。
    正如 Laurens Holst 已经说过的,我们无法判断哪种方式最适合您 - 这取决于您的环境。

    【讨论】:

    • 非常感谢您的建议。请参阅我上面的编辑。在概念层面上它似乎正确吗?谢谢
    • @ThomasClowes:我不确定。请阅读我的回答中的说明。
    【解决方案3】:

    您可能想查看here。如果同时提交了配置文件和 .hgignore,则 .hgignore 将无效。您还可以添加域检查条件:

    $domain = $_SERVER['HTTP_HOST'];
    if ($domain=="localhost") {
        //local copy config
    }
    else if ($domain=="yourdomain.com") {
        //webserver config
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 2015-08-22
      • 2011-03-28
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多