Git .gitignore失效,无法取消某文件/文件夹跟踪,或无法跟踪某文件/文件夹的问题解决

问题一

明明在.gitignore文件中设置了取消跟踪某文件,每次git status时却总能看到它,仿佛.gitignore对它不起作用一样

原因分析:我们要知道的是,.gitignore只对未被track的文件有效,也就是说,一个文件如果已经被跟踪并加入缓存中后,后面如果想要取消该文件的跟踪的话,直接将其加入.gitignore文件中是不行的,我们需要先将其从本地缓存中删除它,然后再添加进.gitignore忽略

具体执行命令

1
$git rm -r --cached dir

然后我们再git status查看,是不是发现已经看不到该文件了,问题一解决

问题二

场景:A项目下有一个子项目B,两个项目都由Git管理

其目录结构大概如下

A/
----.git/
----dir/
----B/
    ----.git/
    ----dir/

然后我们A项目git push提交Github托管,问题来了,我们登陆Github查看A项目时发现,A下面的B文件夹是空的

为什么呢,原因其实很简单,因为B目录下有.git时,git会自动忽略该目录下的所有文件,导致我们push了一个空目录

这样的话解决思路也很简单了,删除B目录下的.git(删除.git的操作是十分危险的,这里是为了举例说明,不要轻易模仿),然后再重新添加

完成后再push,我们发现B目录还是空的!并且我们检查.gitignore文件,发现B目录并没有被添加进去,好像.gitignore又失效了一样

原因分析:git add 添加文件时,git扫描到B目录下的.git文件后,跟踪B目录,并忽略B目录下的子文件,也就是说,git把B这个空文件夹加进了缓存里,后面对B文件下的子文件的操作都会被忽略,删除B目录下的.git后,B目录下的子文件仍然处于被忽略状态

解决办法和上面一样,我们删除B目录下的.git后,删除本地缓存

执行

1
$git rm -r --cached dirB

然后再重新Add、commit、push,问题解决