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

对已经被git跟踪的文件

如果某个文件已经显式的被添加到git本地库或者已经被别人提交到了远程代码库,你想在本地取消git对这个文件的跟踪,那么需要了解如下的git命令

取消跟踪

文件已经纳入了Git管理,想取消文件追踪,这样本地更改不再被管理

1
2
3
4
5
# 关闭跟踪某个文件,修改不提交
git update-index --assume-unchanged xxx.xxx

# 关闭追踪某个目录下的某种类型文件
git update-index --assume-unchanged /xxx/*.xxx

恢复跟踪

恢复跟踪已经被取消跟踪过的文件

1
2
3
4
# 恢复跟踪文件,修改提交
git update-index --no-assume-unchanged xxx.xxx
# 恢复追踪某个目录下的某种类型文件
git update-index --no-assume-unchanged /xxx/*.xxx

文件跟踪管理

1
2
3
4
5
6
# 列出关闭追踪的文件
git ls-files -v | grep '^h\ '
# 提取文件路径
git ls-files -v | grep '^h\ ' | awk '{print $2}'
# 恢复所有文件追踪
git ls-files -v | grep '^h' | awk '{print $2}' |xargs git update-index --no-assume-unchange