即使 __pycache__ 在 Gitignore 中,Git 仍然会继续控制其上的更改。

10

这是我的.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 中。

请参考以下链接获取更好的.gitignore文件:https://dev59.com/D3A65IYBdhLWcg3wogEb - NeilG
2个回答

20

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

.gitignore文件仅告诉Git哪些新文件不应被跟踪。不要从仓库中删除已被跟踪的文件。


这解决了眼前的问题,但当你实际尝试使用历史记录时可能会引起更多麻烦。 - Mark Adelsberger
如果有人问这样的问题,我认为建议重写整个存储库历史记录并不是一个好主意。 - Grzegorz Bokota
我认为将你的假设强加于他们,认为哪种权衡是最好的并不是一个好主意,但是你的观点(虽然不正确)已经被记录下来了。 - Mark Adelsberger
在重写过程中破坏存储库非常容易。 - Grzegorz Bokota
不,这并不是问题;如果出现了什么错误,撤销操作也很容易。 - Mark Adelsberger

4

更新以回答评论中的后续问题


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

如果路径显示为“修改”或“未暂存”,那么这些文件已经被跟踪 - 它们在索引中,可能在之前的提交中,然后再将它们放入.gitignore;或者它们是在将其放入.gitignore后强制添加的。

因此,您正在尝试忽略对已跟踪文件的修改,而这不是您可以在git中做到的事情。

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


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

假设您没有很多长期存在的分支,简单的方法是使用git rm --cached取消暂存更改,然后创建一个新的提交。例如,如果您只关心清理主分支,您可以这样做:

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

现在你应该发现,默认情况下git status不会显示这些文件,git add也不会添加它们。但是,如果您做了一些更改后:

git checkout HEAD^

回退到一个包含这些文件的提交时,即使 Git 没有该文件的更改副本可供恢复,它也会默默地覆盖您对这些文件所做的更改。而且当您随后进行操作时,Git 将

...

git checkout master

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

对于*.pyc文件,这可能是可以接受的(因为Python会快速/安静地重新生成它们),但对于其他文件可能不是,因此最多只能以“谨慎使用”的方式使用此方法。

另一种选择-避免上述问题但带有自己的代价-是重写历史记录,使其看起来就像忽略的文件从未提交过。

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

  • 如果您决定遵循此路径,则存在已有的问题/答案记录过程;您需要寻找具有tree-filter或index-filter的git-filter-branch。


那么,这是否意味着我不能停止使用 git 跟踪一个文件? - HuLu ViCa
1
不是,但这意味着如果您的文件当前正在被跟踪,您需要告诉 Git 停止跟踪它。 - Gillespie
那么,我该怎么做呢? - HuLu ViCa

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