.gitignore无法忽略文件

34

我的.gitignore文件被忽略了,应该被忽略的文件仍然可见。

user@host ~/workdir % git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   .htaccess
#       modified:   application/controllers/statistics.php
#
no changes added to commit (use "git add" and/or "git commit -a")
user@host ~/workdir % cat .gitignore
.htaccess
application/config/config.php
application/config/database.php
user@host ~/workdir %

这些文件已经在版本控制中,但我不想推送对它们进行的合理更改。git rm ...不是一个选项,因为这些文件应该在版本控制中(文件中有其他设置)。我只是不想推送我对这些文件的更改。


也许这篇帖子可以帮到你 https://dev59.com/L3M_5IYBdhLWcg3w-4nw 试试看吧! - gersonlimadev
8个回答

71
我曾经遇到同样的问题:我想为每个代码库使用不同的 .htaccess 文件,但是由于该文件已经添加到代码库中,所以我做不到。现在我的方法可行了,我可以从任何版本更改任何 .htaccess 文件,而无需将它们推送到 Git 上。当Marc表示“在忽略文件之前,您需要先删除它。这可以通过 git rm 命令来完成”时,他是正确的。
我按照以下步骤进行操作:
  • 在其他地方备份您的 .htaccess 文件
  • 使用 git rm .htaccess 删除 .htaccess 文件
  • 提交此更改(即删除 .htaccess)
  • 推送更改(git push)
这显然会删除您的 .htaccess 文件。
  • 然后编辑 .gitignore 文件并添加 /.htaccess
  • 提交更改并推送
  • 通过还原以前的备份来重新创建您的 .htaccess 文件
完成这些操作后,您就完成了:无论您对 .htaccess 文件进行何种更改,都不会再将其推送。难点在于按照正确的步骤执行操作...
希望这能够清晰明了。

1
斜杠!它让我抓狂了,我刚把.htaccess加入到我的gitignore文件里。 - sledgeweight

49

按照这里任意错误的步骤之后,我仍然需要跟踪.gitignore文件中未被忽略的.htaccess文件,以下是帮助解决问题的方法:

git update-index --assume-unchanged .htaccess

要撤消更改:

git update-index --no-assume-unchanged .htaccess

2
您可以通过执行 git update-index --no-assume-unchanged 命令来撤销该效果。 - doc_id

14

由于您需要:

  • 在Git存储库中保留.htaccess文件(不执行git rm操作)
  • 其中包含本地敏感数据

使用筛选驱动程序,将:

  • 在检出阶段完成包含私人数据的.htaccess 文件
  • 在提交阶段从所有敏感数据中清除.htaccess文件

content filter driver

然后,您可以对一个加密文件进行版本控制,您的模糊脚本将会:

  • 是唯一一个解密该文件的脚本
  • 用于完成经典(已推送/已拉取)的.htaccess文件。

您可以将这些加密的敏感数据放在一个特殊的分支中,不要将其推送。
即使您不慎将该文件推送了,也不会造成太大损失,因为只有您的工作站具备解密该文件所需的私钥。


+1 是给这个漂亮的图片和过滤驱动程序的。我一直在想你什么时候会加入,毕竟这是一个版本控制的问题。 :) - Noufal Ibrahim
1
+1 自动化。我本来想建议使用 git update-index --assume-unchanged 作为简单的解决方案,但这种自动化真是太棒了。 - Rob Wilkerson
+1 只是因为有人知道如何运用这些神秘的 Git 技巧。虽然这不是我要找的,但还是很棒! - PapaFreud

10

假设以下内容是.gitignore文件的内容。在这里,.htaccess位于项目的根目录中。

/.htaccess
application/config/config.php
application/config/database.php

执行以下命令以忽略.htaccessconfig.phpdatabase.php文件。

badelal143@gmail.com:work-dir$ git update-index --assume-unchanged .htaccess
badelal143@gmail.com:work-dir$ git update-index --assume-unchanged application/config/config.php
badelal143@gmail.com:work-dir$ git update-index --assume-unchanged application/config/database.php

如果您希望重新开始跟踪它:

badelal143@gmail.com:work-dir$ git update-index --no-assume-unchanged path/to/file

例如。

badelal143@gmail.com:work-dir$ git update-index --no-assume-unchanged .htaccess

这对我有用。我的代码在项目的 /code/ 目录中。$ git update-index --assume-unchanged code/.htaccess。现在,SourceTree 不再跟踪它。 - Vladimir Vukanac
这是唯一对我起作用的方法。让我快疯了,谢谢。 - james-see

8

看起来.htaccess文件已经被添加到版本控制中了。在忽略它之前,您需要先删除它。可以使用 git rm 来完成操作。


我知道,但我不想删除文件。我只想忽略这些更改。 - f00860
如果版本控制中有.htaccess的版本,但您只是不想提交任何更改,则.gitignore无法起作用。据我所知,没有这样的选项。只需不将该文件添加到提交中即可。 - Marc
6
你可以使用 "git rm --cached" 命令,这会将文件保留在目录中,但从索引中删除。 - Peter Tillemans

8
忽略git中的文件并不意味着你不会将它们推送。这意味着你不会对它们进行版本控制。如果你不想推送它们,我建议你创建一个本地分支,其中包含本地机器的内容,然后将必要的更改合并到一个你将推送到远程的分支中。
我想你已经添加了你的文件,现在正在尝试忽略它们。

2
我现在使用的另一种方法是将本地更改存储并在合并/变基后弹出存储。 - f00860
我将这个文件加入了忽略列表,但不知何故又把它添加了进去。干得好@Naufal。 - Josh Metcalfe
1
没有真正回答问题,但是 @anybug 的答案做到了。 - MikeSchinkel

5
我经常这样做。我先将配置文件放在我的代码库中,然后决定不想要它们。
你可以使用以下方法从代码库中删除某些内容:
git rm --cached <<filename>>

2

这个问题困扰了我好几天。 .htaccess 文件已经被纳入版本控制并进行了修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接