Git删除文件在本地但不是远程索引

时间:2014-10-24 06:41:45

标签: git github

我使用GitHub进行多服务器部署,一个是生产服务器,一个是开发服务器。有一些配置文件(我们称之为config.php)需要特定于服务器。但是,出于备份目的,我们需要在GitHub服务器上保留生产的配置文件。但是,在开发服务器上,我们需要继续将它从git push / pull进程中删除,以便它永远不会上传到服务器,或者在git pull命令上覆盖。我怎样才能做到这一点?将它添加到.gitignore会处理这个过程,还是会将其复制到生产服务器上。

对于引用,配置文件与.git相关的位置是/exampledirectory/config.php

2 个答案:

答案 0 :(得分:1)

只有在您确定生产服务器上的.gitignore文件将在需要时手动更改/覆盖时,才能将其添加到config.php。 使用.gitignore绝对不会在发布代码时推送它。

答案 1 :(得分:1)

你的问题的答案:你做不到。

如果配置文件已被git跟踪,则不能仅在本地忽略它(这就是克隆存储库为clone的原因:它实际上是完全相同的内容)

有3个选项:

  • 您可以从git(git rm exampledirectory/config.php --cached && git commit && git push)中删除该文件,但您必须连接到远程服务器并恢复该文件(只有一次)。现在,如果要更改生产配置,则必须远程登录。

  • 或者,您可以将文件重命名为config-default.php,并最终添加一个更新后的挂钩(和/或其他,本地或远程根据您的需要)将该文件复制到config.php如果检测到更改。

*另一种选择(我使用类似的解决方案)需要一些开发来根据您当前的环境(生产,开发或其他)更改配置文件的方式:例如,如果您添加了本地虚拟主机setEnv CUSTOM_ENV develop,您可以使用以下代码:

if (isset($_SERVER['CUSTOM_ENV']))
{
  $config = __DIR__.'/exampledirectory/'.$_SERVER['CUSTOM_ENV'].'/config.php';
  if (!file_exists($config))
    $config = false;
}

if (!$path)
{
  $config = __DIR__.'/exampledirectory/config.php';
}
require_once($config);

您还可以将环境定义基于磁盘中某个位置的文件(名为.debug.inc的空文件,您的ip(127.0.0.1当localhost),您将设置的cookie的值或您想要的任何内容

在该示例中,路径exampledirectory/develop可能位于.gitignore中,因此所有开发人员都可以自定义自己的配置而不会出现任何问题。您可以稍后添加更多环境(preprod,test,...),并根据您要测试的内容进行不同的配置。


此外,如果以后您有超过2个服务器部署,您可以使用一种分层样式(略微)更复杂的配置系统:

首先,加载默认(通用)配置somedir/config.php 其次,检查当前env(somedir/[ENV]/config.php)是否存在其他配置文件,并且是否存在包含它。

因此,如果您的配置文件只返回一个params数组,这不是问题,但是如果您的配置文件包含常量,那么您可能会遇到一些问题(无论如何这都是不好的做法:))。