git提交后忽略文件或文件夹

之前作为一个独立开发者,从来没有在git上出现过问题,最近跟一朋友一起做一个项目,发现了很多问题,其中一个就是文件忽略。

在开发中有很多文件或者文件夹是不需要提交到仓库的,比如编译文件,一些核心的配置等。对于一个协同开发的老手来说,他们很聪明的项目初建时就已经确定了要过滤的文件或文件夹,直接写在.gitignore中过滤掉,这也是最好最推荐的方式。

但也有很多经验不老道的开发者,提交了几个版本之后才发现每次都是一些编译文件之类的东西造成冲突,而这些东西,你的搭档根本就不需要,这时候你才想起来加到.gitignore中,提交时却发现已经没作用了。

这时候解决办法删除追踪这些文件

1
git rm -r --cached 文件/文件夹名

去掉已经托管的文件后重新提交:

1
2
git add .
git commit -m ""

借用网友的话来重新描述以上流程:

如果开发到一半,你才加入了.gitignore的话,之前被加入到git版本控制的文件将不会被排除,这些已经加入的文件将持续被git追踪,这时候我们可以怎么做才能把不再需要被版本控制的文件移除并且不再被git追踪呢?

.gitignore可以告诉git版本系统不要处理制定规则下的文件,但是只要文件有被提交过,就会持续被git所追踪,因此建立.gitignore之前就已经提交文件的话,那么即使再向.gitignore加入新规则,也无法排除已经被追踪的档案。

简单说,.gitignore只能忽略那些没有被追踪的文件(Untracked Files)。

如果想要让新增或更新后的.gitignore设定生效,并且排除已经被追踪过的文件时,可以参考以下步骤:

  1. 清除本机git的快照:相当于将所有文件移除,但没有删除文件
  2. 重新加入git追踪:这时候会套用.gitignore设定
  3. 提交:这个提交内容会将排除的文件删除
1
2
3
git rm -r --cached .
git add.
git commit -m "update .gitignore"

git rm -r --cached .中的-r代表递归(Recursive),用来递归搜索每个文件夹下的文件。

当我们要删除暂存区或分支上的文件,同时工作区也不需要这个文件了,可以使用

1
2
3
git rm 文件路径
git commit -m "delete somefile"
git push