如何在本地工作目录,远程工作目录和git ftp目标中拥有不同版本的文件?

时间:2011-08-24 10:46:25

标签: git codeigniter gitignore

我正在使用Git来管理CodeIgniter项目。我在我的本地机器上工作并推送到远程服务器,在那里我测试所有东西。然后我使用git ftp push更新另一台主机上的生产站点。

现在,为了完成这项工作,我需要三个不同的index.php文件,每个环境一个,我只需设置一个不同的环境变量。

所以我需要gitignore index.php文件,甚至git-ftp-ignore它。对于ftp它正在工作。对于普通的gitignore,它不是:它不断更新远程服务器上的index.php文件。

我尝试了git rm --cached index.php,但我得到的是它完全删除了远程服务器上的index.php文件。

我做错了什么?

编辑:看来这不是我可以用git做的事情,而是I've found a better way to set the CodeIgniter environment variable

2 个答案:

答案 0 :(得分:3)

首先,忽略机制对已在存储库中跟踪的文件没有任何影响。因此,如果您希望.gitignore起作用,则必须从存储库中删除该文件(正如您所做的那样,使用git rm --cached)但是,正如您所观察到的那样,它会在您更新时被删除远程存储库。

总之,在这种情况下,我认为您不应该.gitignore该文件。关于git中被忽略文件的语义有一个微妙之处,它已经让我感到很多次 - 被忽略的文件被视为一次性,因为该机制是为构建产品而设计的。你在这里有一个你想要被忽略的文件,但它很珍贵,git目前没有办法指定它。

例如,在您的情况下,如果您手动重新创建index.php,那么一切正常,但是如果您使用git checkout old-commit移回index.php的旧版本}被跟踪,然后返回到之前的位置git checkout -index.php将被删除!

我建议您更改index.php以从其他文件中获取环境变量的正确设置:

  1. 在存储库外
  2. 或位于存储库中,被忽略,并且位于存储库中从未跟踪过的路径
  3. 理想情况下,还要为其他文件不存在时添加默认值。

答案 1 :(得分:0)

这是一个古老的问题,但我也是这样做的,过去也一直在努力。

发生的事情是,由于index.php最初并不在您的.gitignore中,因此所有存储库都会跟踪index.php。

当您更新开发站点上的.gitignore并将其从存储库中删除时,它所做的就是将“deleted index.php”传递给您的生产站点。如果您的生产站点仍然缺少ITS .gitignore上的index.php,那么它将“删除”index.php。

您需要做的是确保将index.php添加到每个存储库的每个分支上的每个.gitignore。那么你可以使用rm --cached,一切都会按预期工作。