如何防止开发人员推送特定文件?

How can I prevent developers from pushing a particular file?

我有一个存储库,供从事我的项目的开发人员使用。在这个 repo 中,有一个文件“.your_local_variable.php”,其中有开发人员在开始处理项目之前必须填写的相对于他们的机器的路径。我希望开发人员在他们第一次在他们的机器上克隆 repo 时仅拉取此文件的 "template" 一次,但我想阻止他们在合并请求中发送此文件。

我试着把它放在 .gitignore 中,然后远程推送 .gitignore,这样他们就可以检索它,但是文件“.your_local_variable.php”仍然存在在命令 "git status" 上显示为 "changes not staged for commit"。

有什么方法可以阻止推送此文件,并将其从 git 状态中隐藏起来,同时在远程仓库中保留此文件的 "template version"?

如果文件已经签入 git,仅将其添加到 .gitignore 将无法解决问题。

您需要使用 git rm 从 git 中删除文件 + 将文件添加到 .gitignore,然后推送此提交 - 其中包含删除 + 忽略。每个人都需要取消此更改,以使其停止显示在您的 git 状态中。

你也可以保留模板版本在git,告诉大家复制+重命名文件到忽略的那个。这是 git 上的样子:

  • template-for-everyone.file(签入 git 以便人们可以检索,任何人都不应更改此文件,除非您想更改模板)
  • my-local-template.file(把这个文件加到.git忽略,大家复制模板改成这个名字)
  • .gitignore(其中包含 my-local-template.file

这通常在版本控制之外进行。您将在自述文件中描述所需的文件(或提供扩展名为 .txt 的模板,例如)并让开发人员手动添加它。但是,它应该在 .gitignore 中。

我认为最常见的解决方案是创建一个模板文件,提交它并忽略实际文件。

假设您的文件名为 foo.bar,您可以使用模板提交名为 foo.bar.example 的文件,然后在 .gitignore 文件中添加 foo.bar

要从您的存储库中删除您的文件,您只需 运行 git rm --cached foo.bar 并提交它。

然后您的协作者会将其本地环境中的 foo.bar.example 文件复制到新的 foo.bar 文件。

在一次提交中:

  • 删除文件。
  • 将其添加到 .gitignore。
  • 将文件的 non-working 版本添加到存储库。例如:

    .your_local_variable.phpREMOVEME

然后每个开发人员都有一个模板文件,在与它交互之前不会引起任何问题。

另一种解决方案是让文件从环境变量中选取值,有时使用默认值:

<?php
// This variable represents the path for blablabla
$somePath = getenv("PROJECT_SOME_PATH");
// This variable represents the time to wait before contacting the customer (in hours)
$timeToAnswer = getenv("PROJECT_TIME_TO_ANSWER", 42);
// .....

这样,开发人员在他们的环境、容器、其他中定义自己的值,而无需触及文件(然后在此处供参考)。

第一步是使用环境变量更新您的文件,推送它并与其他开发人员沟通他们需要设置他们的环境。