Git 忽略文件,不删除它

Git ignore file, without deleting it

我有一个使用 GIT 进行版本控制的网站。我有一个系统设置,基本上可以自动将 master 分支中的更改部署到我的生产服务器。也就是说,我的存储库中有一个网络挂钩,它触发一个 PHP 脚本,该脚本实质上是在服务器上启动一个 git pull 以拉下更改。

我的问题在于我目前有一个使用 git 跟踪的配置文件 (config.php)。我自己和另一个开发人员想要拥有我们自己的 config.php 文件,这些文件与服务器上的文件不同,因此我们想告诉 git 停止跟踪该文件并假装它不存在。

我们决定首先使用一个不太重要的文件进行测试,因此我们将 test.php 添加到我们的 .gitignore 文件中,希望这样可以达到目的。 Git 仍在跟踪文件,所以我尝试 运行 git rm --cached test.php 试图停止跟踪文件。这似乎奏效了,所以我们承诺并推动了我们的改变。

令我惊讶的是,当我们的部署脚本启动对我们服务器的拉取时,我们发现该文件已从生产环境中删除。幸运的是,删除的 test.php 并不重要。

TLDR; 我如何告诉 git 忽略它当前跟踪的文件,取消跟踪并从我的存储库中删除它,但在我的生产中保持完整服务器?

如果您从存储库中删除跟踪的文件,则在提取更改后该文件将被删除。这是预期和期望的行为,因为如果从存储库中删除文件,则假定不再需要它。

对于您的情况,最简单的解决方案是从存储库中删除文件并将其添加到 .gitignore,然后立即手动将其添加回服务器。您也可以先对服务器上的文件进行一些无关紧要的更改,例如添加一个空行,以导致拉取失败。

另一种选择是将文件保留在存储库中并在您的开发存储库中使用 git update-index --assume-unchanged config.php。这告诉 git 忽略对文件的更改,尽管它被跟踪。

另一种选择是创建一个像 local_config.php 这样的新文件,该文件不被 git 跟踪并且如果存在则被 config.php 有条件地包含。您可以在此文件中进行所有本地修改。

最后一个选项的优点是您仍然可以通过将文件的新版本推送到存储库来在服务器上修改 config.php