解决.gitignore文件忽略规则无效git依然跟踪修改的问题

本文主要记录了在使用Git过程中遇到的一个问题,也就是标题所说的在.gitignore文件里添加的忽略规则没有生效,导致本应该被忽略的文件/文件夹和目录总是不断的被Git纳入版本管理,每当项目文件修改都会重复引发跟踪!

首先要说明下,本文所提及的问题,Git官方是有很详细的文档进行说明的,包括具体的情景和解决办法,所以后面会引用Git官方中文文档的说明,本文算是一篇记录笔记,会结合我自己的理解和案例来写,这里建议先看Git文档的这一章节:2.2 Git 基础 - 记录每次更新到仓库,重点在文档底部的移除文件节点,如果对Git比较不熟悉的朋友,强烈建议读完整个章节

一、.gitignore规则无效的原因

据我所知导致.gitignore里的忽略规则失效只有两种情况,当然我对Git的使用和理解比较浅薄,也只能想到这两个方面:一种是忽略规则的语法错误,这种情形好处理,只要修正错误的语法就可以了。PS:本文不对语法错误的问题详细说明,毕竟每个人情况不同。排查语法问题这事我也不知道怎么举例,总之只要符合官方规范的就可以了,需要注意的好像也就一个路径问题吧?!

另一种则是本文要重点说明的情况:项目中的文件或目录已经被纳入到Git的版本管理里面/跟踪文件清单,此时你再往.gitignore里添加此文件/目录的忽略规则就会发现毫无作用,因为已经被Git跟踪(track)的文件/目录无法被.gitignore忽略掉!

这里再对上面一段所说的进行详细说明,所谓“已经被纳入到Git的版本管理里面/跟踪文件清单”,大体上指的是下面的三种情况:

  1. 已使用add命令开始跟踪项目文件或者将修改的文件放入暂存区/索引
  2. 已使用commit命令提交更新到本地仓库
  3. 已使用push命令将项目文件推送到了Git远程仓库了(例如GitHub)

上述的三种操作只要进行了其中一项,再添加对应文件的忽略规则都是不生效的!PS:这三个命令在GUI客户端上一般都可以找到对应的按钮和操作。

这里额外提下,如果按照反向理解,也就是说只要是文件/目录还没有被Git跟踪,那么你添加的忽略规则都是有效的,重点在于文件的是否属于被跟踪(track)状态。

二、具体的解决方法-配合案例演示

先说使用Git命令处理的方法,这也是我比较推荐的方式,后面还会讲一个简单的方法但并不推荐,因为不利于Git的学习与掌握,而且有部分限制。这里额外再提醒下,官方文档是有详细的解决方法的,建议阅读官方文档,接下来会结合一个案例来进行说明。

2.1 案例背景说明

这里我在VS里新建了一个ASP.NET MVC项目并进行生成,项目生成后会创建bin文件夹(注意这时候还未添加对应的忽略规则,bin文件夹里都是编译生成的文件):

案例文件夹结构

此时由于疏忽大意或操作失误不小心使用add命令对bin文件夹以及里面所有文件进行了跟踪(例如使用git add -A,或者直接用GUI客户端批量操作),发现后想要亡羊补牢在.gitignore里添加了[Bb]in/这条规则([Bb]in/=Bin/+bin/,也就是大小写都能匹配到),但是发现并没什么用,在命令行窗口使用git status可以看到bin文件夹里的文件无法被忽略:

.gitignore无效截图

GUI界面截图:

可视化界面依然显示绿色加号

2.2 未进行提交操作的处理方式

如果此时还未进行提交操作,赶紧使用如下命令可及时挽救:git rm --cached <file>,其中<file>表示要从暂存区移除出去的文件名或者目录路径,注意可以使用通配符。不过Git有自己的通配符规则,所以要注意下差异,例如官方文档有提到在*号前面是需要加反斜杠\的(我有测试过不加也没事但是最好按照规范来),结合上面的案例,因为我们要移除bin文件夹下的所有文件,所以完整的Git命令为(注意路径一定要正确):

git rm --cached WebApplication1/WebApplication1/bin/\*
使用git rm --cached删除暂存
删除暂存后查询状态

这里要留意忽略规则的添加时机,在命令执行后会有不同的影响,假设忽略规则是在git rm --cached <file>命令执行前就设置了,那么当命令执行完成后马上就可以看到效果,bin文件夹及里面的所有文件会被Git直接忽略。如果在命令执行后还没有添加忽略规则,你会发现bin文件夹下的文件变成未被跟踪的状态,也就是最初的状态,此时你再添加忽略规则这些文件就会被忽略了。

2.3 文件已经进行提交操作的处理方式

如果bin文件夹已经被Git跟踪并提交到了本地版本库甚至远程版本库(例如GitHub),解决方法和上一小节2.2中的方法是一样的,依然是使用git rm --cached <file> 这个命令。PS:在执行此命令前Git最好能保持干净的状态,也就是"nothing to commit, working tree clean"。

注意!!!在命令执行后受影响的文件都会变成未跟踪状态,此时一定要马上使用git commit -m '备注信息'命令提交这部分修改,如果还未设置.gitignore文件则可以设置后一并提交此次更新到本地仓库。这里千万不要使用任何GUI客户端去操作!因为不同GUI客户端可能有不一样的执行结果(例如可能会将文件重新纳入跟踪,等于刚刚的操作白费了)。

commit命令

2.4 简单的解决方法:直接删除物理文件

在上面两小节2.2-2.3中使用git rm --cached <file>命令最终只是将文件从暂存区移除而不删除物理文件(也就是只删除Git对文件或目录的跟踪状态),这样的好处是一些项目开发或调试需要的文件都可以保留下来,例如本地日志文件、编译文件、本地数据库、测试图片之类的。

如果遇到实在依赖GUI客户端或者对Git命令不熟悉,也没有时间去查阅官方文档的情况,也只能通过简单的方法去处理了,大体操作流程如下:

  1. 先将文件进行备份,除非能确定文件删除后不需要还原回来,否则一定要做好备份
  2. 备份完成后直接从硬盘/本地工作目录里删除这些无法被忽略掉的文件或文件夹
  3. 然后马上提交这部分修改到Git版本库里(通过GUI客户端进行操作或者使用Git命令都可以)
  4. 接着在.gitignore文件中添加忽略规则并提交到Git版本库里
  5. 最后将之前删除的文件拷贝回来(注意第一步已经做了备份)

完成上面5个步骤可以测试下忽略规则是否有重新生效。

最后附上官方文档的截图:

三、总结

先来一段碎碎念,作为一名轻度的Git使用者,总是为了图方便而使用类似GitHub DeskTop的GUI客户端。偷懒的结果就是对Git的掌握处于半桶水的水平,只知道怎么用而没有深入理解和搞懂,也就是所谓的“只知其然,而不知其所以然”。最近遇到了这个小问题彻底暴露了隐藏的缺陷,只好静下心来好好读一遍官方文档,从头理解Git并学习命令行的使用方式。

最后总结下两点:

  1. 良好的开发习惯还是要有的,在项目添加到Git版本控制库之前,一定要先设置好忽略规则。
  2. 已经被Git跟踪(track)的文件是不受.gitignore影响的。

转载:由十有三创作**
来源 https://shiyousan.com/post/636470505667009340

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345