【问题标题】:change .gitignore after some commits/push在一些提交/推送后更改 .gitignore
【发布时间】:2017-03-18 01:13:13
【问题描述】:

我在我的 github 帐户中创建了一个存储库,其中包含一个没有 .gitignore 文件的 socialengine php 项目。

然后我克隆存储库 localyl 并创建一个 .gitignore 文件并编写一些路径行以忽略文件和文件夹。
举个例子

temporary/log
temporary/session
temporary/package

install/config/auth.php 路径中有一个文件auth.php,我还在我的.gitignore 文件中写了它的路径以忽略它,如下所示

install/config

在安装过程中,我看到临时文件夹的子文件夹被忽略了。

我的想法是,当我在安装步骤中应该在 auth.php 文件中编写一些身份验证代码行时,当我键入 git status 时,文件 auth.php 看起来没有暂存。
尽管我在 .gitignore 文件中包含了路径(安装/配置),但我无法弄清楚为什么会发生这种情况。

我也试过install/config/install/config/*,但没有。

如果我使用git rm --cached install/config/auth.php,则该文件将被远程删除,这是绝对不能发生的,因为社交引擎安装和未来安装需要该文件。

有什么想法我可以为这种情况做些什么?

【问题讨论】:

  • 你想对提交的文件进行本地更改,但需要 git 忽略本地更改?
  • 完全应该忽略 auth.php 文件中的这个本地更改,因为它与本地安装有关。不需要提交/推送文件 auth.php,因为他们 PC 上的其他开发人员也将拥有他们的本地 auth.php

标签: git gitignore socialengine


【解决方案1】:

不要那样做!

你在这里所做的是将维护本地auth.php文件的责任分配给使用它的源系统

考虑以下思路。假设您是系统的用户,您从供应商处获得。每个季度,供应商都会向您发送一个新系统。但是,每当您调整服务器时,您都会重新配置,每月一次,或者有时根据负载或多或少频繁。

作为用户,您应该多久提交一次您自己的个人配置?好吧,每次它发生变化时,如果你对它进行源代码控制的话。这是每月一次,或多或少。

三个月 个月,供应商会向您发送最新版本的系统......他会强加给您一个新配置,即使那不是 您的 配置。这只是错误。您不仅不希望提供新配置,您的配置更改计划也不是他的计划。

解决方案是:作为供应商,不要这样做。不要将本地配置放入 .您的用户将拥有自己的本地配置,他们将这些配置与您的代码分开存储,甚至可能存储在完全独立的存储库中。

“但我的用户很愚蠢!我必须强加他们的配置!”

嗯,没关系;许多是。继续并包含 initial 配置或 default 配置。如果您的用户没有设置他们自己的 配置,请使用它——甚至可以将其复制到作为本地配置的位置。但是,在那之后,不要碰他们的本地配置。1更新初始和/或默认配置,当然。但不要触碰用户的本地配置。


1除了迁移之外:如果用户从 1.7 版升级到 2.1 版,您可以迁移他们的本地配置以添加新功能。根据您的配置文件格式,如果他们希望从 2.1 降级回 1.7,您可能还需要支持反向迁移。

【讨论】:

  • 不完全理解您的解释。 auth.php 文件有一行代码和一个 md5 字符串,是在安装过程中生成的。这会发生并且必须针对每个安装单独发生。
  • 好的,所以,它并不是真正的配置,但它仍然是你生成一次的东西。您不将其存储为源的一部分!在类 Unix 系统上,此类文件通常应存储在 /var/db 某处,例如,/var/db/foo/md5 用于程序 foo。 (在 Windows 中,可能正确的位置是 Windows 注册表,尽管我不使用 Windows。)
  • 它是一个使用 socialengine 进行安装的文件 auth.php。但是仍然有一个问题,为什么 gitignore 会忽略临时子文件夹而不是 install/config/auh.php 文件。对我来说很奇怪
  • 如果一个文件在索引中,它会被跟踪,任何忽略文件中的任何内容都不会改变它。如果文件在索引中,则它是未跟踪的。如果文件处于提交中,则检查该提交会将其放入索引中,从而放入工作树中。如果文件不在提交中,但当前在索引中,则检查提交从索引中删除文件,因此也来自工作树。 .gitignore 中的条目并不意味着“忽略文件”,而是意味着“在未跟踪时不要抱怨文件的未跟踪性,也不要使用批量添加操作自动添加文件。”
  • 是的,谢谢,例如,自动生成的文件(如日志)未被跟踪,因为 gitignore 中有一条规则可以忽略它们,但 auth.php 已经被跟踪,因此它的规则没有意义。
【解决方案2】:

本地忽略

您需要使用assume-unchanged 标志
https://git-scm.com/docs/git-update-index

# To temporarily ignore changes in a certain file, run:
git update-index --assume-unchanged <file>

# When you want to track changes again:
git update-index --no-assume-unchanged <file>

服务器端忽略

阅读此完整答案,并使用完整代码在服务器端执行此操作:
What are some more forceful ways than a .gitignore to keep (force) files out of a repo?


--[no-]假设不变

指定此标志时,不会更新为路径记录的对象名称。

相反,此选项设置/取消设置路径的“假定不变”位。

assume unchanged 位打开时,用户承诺不会更改文件并允许 Git 假设工作树文件与索引中记录的内容匹配。如果要更改工作树文件,则需要取消设置以告知 Git。这在处理具有非常慢的 lstat(2) 系统调用(例如 cifs)的文件系统上的大型项目时有时会很有帮助。

如果需要修改索引中的这个文件,Git 将失败(优雅地),例如合并提交时;因此,如果假定的未跟踪文件在上游发生更改,您将需要手动处理这种情况。

【讨论】:

  • 据我了解,这是一个本地解决方案。每个开发人员都可以使用它来忽略 auth.php 文件。我的想法是为什么 git 不能直接从 .gitignore 忽略它。窗户可能是问题的一部分...
  • 您可以在服务器端使用 git hook 来“忽略”提交时的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2015-08-07
  • 2018-07-09
相关资源
最近更新 更多