从Git仓库中删除一个已存在的文件

127

我希望 Git 停止跟踪我们的存储库中的本地开发日志 (log/development.log)。这是否可能?如果可以,如何实现?


可能是重复的问题:如何让 Git “忘记”一个曾经被追踪但现在被列入“.gitignore”文件的内容。原文链接:https://dev59.com/pXM_5IYBdhLWcg3wrFMt - Cascabel
3个回答

144

为了一次性给出完整的答案:

  1. klemens的建议:你需要将文件添加到你的.gitignore文件中,在不想要的文件上面的某个位置。例如:

    $ cd $ cat >> .gitignore development.log C-d

  2. m. narebski的建议:然后,你需要通过执行"git rm --cached <file>"来从版本库中删除该文件,然后提交此操作以完成删除。

如果你还希望使版本库看起来好像从未追踪过该文件,则更为复杂,而且强烈不建议这样做,因为它不仅会为历史记录中的每个提交创建全新的提交,从而在其他克隆了你的版本库的人之间以一种非常恶劣的方式破坏互通性,而且它还会使每个提交都未经测试(假设你在提交之前进行测试)。

在考虑这一点的同时,如果这是你的目标,你需要的工具是filter-branch。第一个示例正是我所描述的。


3
使用 git rm --cached 命令似乎不仅将文件从分支中删除了,而且在我将其拉到另一个系统时,它也会物理上删除那个系统上的文件。你知道这是怎么回事吗? - biagidp
2
回应上述问题:我认为问题在于在拉取更改之前,我没有在备用系统中设置.gitignore文件,因此删除操作会移除本地副本。至少这是我的理论。 - biagidp

54
要停止跟踪该文件,只需使用git rm --cached <filename>
但正如其他人在这里指出的那样,将该文件添加到.gitignore中可能会防止您在以后意外再次添加它。

1

13
这只是答案的一半。.gitignore 里的条目不适用于已经被追踪的文件。 - CB Bailey
10
第二部分是git rm --cached <file> 然后提交这个删除操作。 - Jakub Narębski
1
为什么git没有一个简单的命令,可以根据当前的.gitignore文件重新评估所有当前跟踪的文件呢?...或者这是运用了太多常识了吗? :p - Alexander

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