忽略远程存储库(github)中已经存在的文件/文件夹的问题

时间:2019-08-19 11:00:08

标签: git phpstorm gitignore

我正在研究PhpStorm。我想让git忽略一些文件/文件夹。这些也位于远程存储库中。我只是不想反映它们的更多更改,但是它们必须保留-而不是从远程存储库中删除,因为我将从该存储库中拉出到生产服务器。

  • 我已将它们添加到项目根目录下的.gitignore文件中。
  • 我已将它们添加到“ PhpStorm设置”>“版本控制”>“忽略的文件”部分,如此处https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000154070-How-to-gitignore-idea-files
  • 所述
  • How to ignore files which are in repository?,该问题准确地描述了我的问题,但是我尝试了两种方法(在已接受的答案中进行了描述),这是发生的情况:
    • git rm -r --cached .idea/ 我这样做了,相关的文件/文件夹也从我的远程存储库中删除了,这是我不想要的,因为我认为当我拉入生产服务器时,它将导致删除这些文件/文件夹。
    • git update-index --assume-unchanged .idea/ 我这样做了,“忽略路径.idea /”是在终端中编写的,我希望它能起作用,但是当我要提交时,我再次看到了该文件夹。

我在做什么错了?

注意:.idea文件夹对于生产服务器可能并不重要,但是要运行代码,需要一些重要的文件夹。

2 个答案:

答案 0 :(得分:3)

请勿使用--assume-unchanged忽略跟踪的文件

--assume-unchanged标志的目的是告诉Git避免检查特定路径中的文件是否发生更改,因为它们不应该更改

来自documentation

  

在路径上设置此位并不意味着Git将检查文件的内容以查看其是否已更改。-这使Git忽略了所有检查并假定它没有更改。

此功能是一项性能优化功能,以防您的回购包含非常大的文件和/或较慢的文件系统。

作为Junio C Hamano points out在有关difference between .gitignore and --assume-unchanged的讨论中:

  

假设不变的机制不应被滥用。它   是“我知道我的文件系统操作很慢。我向Git保证   我不会用这些来改变它们的路径。

他继续:

  

特别是,Git承诺不是   认为这些路径未修改-如果Git可以确定路径   标记为假设不变的已更改而不会发生   lstat(2)的额外费用,它保留报告路径的权利   已被修改 (因此,git commit -a可以自由提交   改变)。

换句话说,如果修改了标记为--assume-unchanged的路径中的文件,则Git可能会决定忽略该标志(如果这样做不太慢)。这可能就是为什么您看到.idea/目录中的文件已被修改的原因。

改为使用--skip-worktree

还有另一种告诉Git忽略路径更改的方法,那就是设置--skip-worktree标志。

来自documentation

  

在读取条目时,如果将其标记为skip-worktree,则Git会假装其工作目录版本为最新版本,而是读取索引版本。

您可以将 entry 替换为 path --skip-worktree--assume-unchanged之间的区别在于他们做出的假设--assume-unchanged期望文件不被修改,而--skip-worktree则不会完全关心工作目录中文件的状态。

documentation这么说:

  

可能存在或不存在工作目录版本。如果存在,其内容可能与索引版本不匹配。

一旦路径标记为--skip-worktree,Git就会从仓库的历史记录中排除对工作目录中文件的任何本地修改。

答案 1 :(得分:0)

我发现我错了。对于那些可能需要的人,我将用我拥有的两个文件夹进行说明:

  • config /和它下面的config.php
  • pdf /和它下面的pdf.css

所以:

git update-index --skip-worktree config/

运行此命令并更改config.php并没有帮助。另一方面:

git update-index --skip-worktree pdf/

运行此命令后,我从Web应用程序获得了pdf输出,并且还在pdf /文件夹下创建了pdf.html。因此,这个新文件被忽略了。

简短地说,我得出的结论是,如果我想忽略该文件,则必须指出确切的文件,例如:

git update-index --skip-worktree config/config.php

此后它将忽略对该文件的任何更改。

(我对--assume-unchanged进行了同样的尝试,它确实有效,但是由于我对上述答案的理解非常深刻,因此我想在此强调更好的方法)