git 继续控制 __pycache__ 上的更改,即使它处于 gitignore

git continues to control changes on __pycache__ even when it is in gitignore

这是我的 .gitignore:

*__pycache__*
*.pyc
db.sqlite3
*.DS_Store
media/
res/

我可以在我的 Atom 上看到 __pycache__ 目录被 VcsIgnored(这意味着被识别为不受 [=40= 控制的版本])

但是,无论如何,当我对文件进行更改时,我会在我的 Atom git window:

我不知道问题出在 git 还是 Atom.

已更新以解决评论中的 follow-up 个问题


.git忽略 适用于未跟踪的文件。

如果路径显示为 "modified" 或 "unstaged",这意味着文件已经被跟踪 - 它们在索引中并且可能在您将它们放入 git 之前的先前提交中忽略,或者它们是在您将它们放入 gitignore.

后强制添加的

所以您试图忽略对跟踪文件的修改,这不是您可以在 git 中执行的操作。

(明确地说,您可能会找到答案,说您可以在索引上使用各种标志来忽略对暂存文件的更改。这几乎总是会导致麻烦,因为这不是这些标志的用途。)


那么如何忽略这些文件呢?你必须告诉 git 停止跟踪他们。这很容易做到,但它有潜在的麻烦副作用。

假设您没有很多 long-lived 分支,简单的方法是 git rm --cached 取消暂存更改,然后创建新的提交。例如,如果你只担心清理 master 分支,你可以

git checkout master
git rm -r --cached __pycache__ # or whatever other paths
git commit -m "remove unwanted files'

现在你应该发现,git status默认不显示这些文件,git add也不添加。但是,如果你做了一些改变文件的事情然后

git checout HEAD^

回到包含这些文件的提交,git 将悄悄地破坏您对这些文件所做的更改,即使它没有要从中恢复的更改副本。当你随后

git checkout master

它们将从工作树中完全删除。

对于 *.pyc 文件,也许这是可以接受的(因为 Python quickly/quietly 无论如何都会重新生成它们);对于其他文件可能不是,所以这充其量是一种 'use with caution' 方法。

另一种方法 - 避免上述问题但有其自身的成本 - 是重写历史记录,使被忽略的文件看起来从未提交过。

  • 请注意,与任何历史记录重写一样,您必须与共享该存储库的任何其他人协调

  • 如果您决定遵循此路径,现有 questions/answers 记录了该过程;你会用 tree-filter 或 index-filter.

  • 寻找 git-filter-branch

尝试git rm --cached */__pycache__/*

.gitignore 文件仅通知 git 不应跟踪哪些新文件。不要从存储库中删除已跟踪的文件。