git继续控制__pycache__上的更改,即使它在gitignore中也是如此

时间:2019-07-11 18:31:16

标签: python git gitignore

这是我的.gitignore

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

我可以在我的 Atom 上看到__pycache__目录是VcsIgnored的(这意味着该目录不受 git 的版本控制)

enter image description here

但是,无论如何,当我对文件进行更改时,会在我的 Atom git窗口中获得多个__pycache__文件,这些文件已被修改和取消登台:

enter image description here

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

已更新,可解决评论中的后续问题


.gitignore仅 适用于未跟踪的文件。

如果路径显示为“已修改”或“未暂存”,则意味着文件已被跟踪-它们已在索引中,并且可能在之前的提交中,您已将它们放入gitignore,或者在将它们放入后被强制添加在gitignore中。

因此,您试图忽略对跟踪文件的修改,而这不是您可以在git中完成的事情。

(为清楚起见,您可能会找到答案,说您可以在索引上使用各种标志来忽略对暂存文件的更改。这几乎总是会带来麻烦,因为这不是这些标志的作用。)


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

假设您没有很多长期存在的分支,简单的方法是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仍然会快速/安静地重新生成它们);对于其他文件则可能不是,所以这最好是一种“谨慎使用”的方法。

一种替代方法-可以避免上述问题,但要自付费用-重写历史记录,使其看起来像从未提交过被忽略的文件。

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

  • 如果您决定采用此方法,则存在记录该过程的现有问题/答案;您会使用树过滤器或索引过滤器寻找git-filter-branch。