以前,以下是我的.gitignore
文件:
...
config/database.yml
.DS_Store
后来我在config目录中创建了一个app_config.yml
文件并提交了它。
现在,我意识到我不需要git存储库中的app_config.yml
文件。
我修改了.gitignore
文件:
...
config/app_config.yml
config/database.yml
.DS_Store
现在,当我提交时,app_config.yml
文件仍在我的回购中。
我想从我的仓库中删除该文件。我该怎么办?
答案 0 :(得分:48)
正如“ignoring doesn't remove a file ”中所提到的
(以下引用 Nick Quaranto 的伟大文章,
在他的博客git ready“一次学习git一次提交”):
当你告诉Git忽略文件时,它只会停止观看该文件的更改,而不是其他任何内容。
这意味着历史记录仍然会记住该文件并具有。如果要从存储库中删除文件,但将其保存在工作目录中,只需使用:
git rm --cached <file>
但是,这仍然会将文件保留在历史记录中。
如果您确实要将其从历史记录中删除,那么您确实有两个选择:
- 重写您的存储库提交,或
- 重新开始。
这两个选项都很糟糕,这是有充分理由的:Git努力不丢失你的数据 就像重新定位一样,Git强迫你考虑这些选项,因为它们是破坏性的操作。
如果您确实想要从历史记录中删除文件,那么
git filter-branch
就是您正在寻找的钢锯。
在使用之前肯定会阅读 manpage ,因为它会逐字地重写项目的提交。对于某些操作来说,这实际上是一个很棒的工具,可以做各种各样的事情,比如完全删除作者提交的项目根文件夹。从所有修订中删除文件的命令是:
git filter-branch --index-filter 'git rm --cached <file>' HEAD
当您需要清除可能已存储在存储库中的敏感或机密信息时,此操作绝对有用
答案 1 :(得分:0)
当您想开始忽略已提交的文件并将其保留在项目中时没有帮助...因为 git rm --cached 会将其从git repo中删除...
我找到了我想要的How do I stop Git from tracking any changes to a file from this commit forward?。
希望它对其他人也有用...