我正在研究PhpStorm。我想让git忽略一些文件/文件夹。这些也位于远程存储库中。我只是不想反映它们的更多更改,但是它们必须保留-而不是从远程存储库中删除,因为我将从该存储库中拉出到生产服务器。
git rm -r --cached .idea/
我这样做了,相关的文件/文件夹也从我的远程存储库中删除了,这是我不想要的,因为我认为当我拉入生产服务器时,它将导致删除这些文件/文件夹。git update-index --assume-unchanged .idea/
我这样做了,“忽略路径.idea /”是在终端中编写的,我希望它能起作用,但是当我要提交时,我再次看到了该文件夹。我在做什么错了?
注意:.idea文件夹对于生产服务器可能并不重要,但是要运行代码,需要一些重要的文件夹。
答案 0 :(得分:3)
--assume-unchanged
忽略跟踪的文件 --assume-unchanged
标志的目的是告诉Git避免检查特定路径中的文件是否发生更改,因为它们不应该更改。
在路径上设置此位并不意味着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
标志。
在读取条目时,如果将其标记为skip-worktree,则Git会假装其工作目录版本为最新版本,而是读取索引版本。
您可以将 entry 替换为 path 。 --skip-worktree
和--assume-unchanged
之间的区别在于他们做出的假设:--assume-unchanged
期望文件不被修改,而--skip-worktree
则不会完全关心工作目录中文件的状态。
documentation这么说:
可能存在或不存在工作目录版本。如果存在,其内容可能与索引版本不匹配。
一旦路径标记为--skip-worktree
,Git就会从仓库的历史记录中排除对工作目录中文件的任何本地修改。
答案 1 :(得分:0)
我发现我错了。对于那些可能需要的人,我将用我拥有的两个文件夹进行说明:
所以:
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
进行了同样的尝试,它确实有效,但是由于我对上述答案的理解非常深刻,因此我想在此强调更好的方法)