关于gitignore的一些笔记_忽略已经提交的文件

本文介绍了如何有效使用 .gitignore 文件来排除不必要的文件不被 Git 跟踪,包括已提交文件的忽略方法及最佳实践。文章还探讨了如何处理配置文件的版本控制问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为项目迁移的原因,遭遇了一些ignore的问题,就想趁机会把这个忽略的规则搞清楚,期间搜索到了很多信息,多是让清楚缓存,即git rm -r --cached .idea,但是没有详细的解释,所以翻到了这一篇文章:https://github.com/wujunchuan/wujunchuan.github.io/issues/18,总结的非常全面,下面是具体内容。


我们在使用git作为版本控制工具的时候,有一些文件是不需要纳入版本控制系统中的。例如在编译过程产生的中间文件等等。正好今天刚好接触到.gitignore的一些用法。其实.gitignore的语法并不复杂,可以参考

【git】.gitignore用法

或者在命令行中输入man gitignore可以查看具体用法

每个项目都有不同的需求,我们不可能一一列举,这样太麻烦了。好在GitHub官方有发起一个库,这里收藏了许多常见的项目所一般需要忽略的文件。我们可以在这个文件的基础上稍加修改,以满足我们的需要。

a collection of useful .gitignore templates

最佳实践:

要养成一开始就设置好.gitignore的好习惯,以免将来误提交了这类无用的文件

忽略已经提交的文件

为了避免麻烦,最好是一开始就设定好.gitignore文件,避免误提交了这些无用的文件。但是并不是所有情况都能在最开始就考虑周全的。因为.gitignore只能忽略掉那些原来没有被track的文件,如果有一些文件已经被纳入版本控制管理当中,那么直接修改.gitignore是无效的

忽略已经提交的文件场景分为很多种

  • 例如说,有些文件已经被提交,但是后期做项目的过程中,我们想要忽略这些文件的跟踪。这些文件在本地磁盘中还想保留着

    此时我们可以这样做:

    • git rm --cache somefiles 删除本地缓存

    • 更新gitignore文件,忽略目标文件(somefiles)

    • 最后git commit -m 'We don't need that somefiles

注意,这种方法下somefiles只会在提交者的磁盘中保留,如果其他开发者拉取你的commit后,他们磁盘内的这些文件也会消失

  • 又比如说,有些文件已经被提交,但是后期做项目的过程中,我们发现我们并不需要跟踪这些文件。这些文件的存在只会让冲突更加频繁。我们想要让这些文件彻底的移除出版本控制系统

    此时我们可以这样做:

    • git rm somefiles 从本地移除这个文件,并且删除本地缓存

    • 更新gitignore文件,忽略目标文件(somefiles)

    • 最后git commit -m 'We don't need that somefiles

  • 但是我们有时候需要有一个配置文件,例如数据库的连接信息,每个开发者的连接信息都是不一样的。但是又要提供一个标准的模板来告知如何填写连接信息,那么就需要在仓库中记录一个标准配置文件,然后每个人根据自己的具体情况配置一份连接信息自用,但是不会将这个配置文件提交到仓库里。

    能不能先将其纳入版本控制,然后再编写.gitignore来忽略这个文件?这样一来别的开发者也有这个文件了。

    答案是:不能,刚才我们说了,已经提交的文件不能直接通过.gitignore来忽略这个文件。一旦修改了这个配置文件,git仍然会检测到的。当然有一个做法是通过git update-index --assume-unchanged。这个待会讨论。

    对于这个需求,一些知名的开源项目是这样处理的,可以将其当做一个最佳实践

    对于充当模板的文件,在文件名加以区分

    例如实际配置文件叫database.conf,在写好模板后更名为database.conf.example。git将database.conf.example纳入管理,但是忽略database.conf。在项目中约定,每个人clone下项目之后,复制database.conf.exampledatabase.conf,然后修改database.conf文件。这样既满足了项目的模板配置文件能够下发到每个参与开发的人,又不会跟踪每个人编写的配置文件。

另外一种办法为何不好

刚才提到了,可以通过git update-index --assume-unchanged让git忽略我本地需要排除的文件,提交到远程分支后,这样git就不会把这些修改提交到版本库了。 为啥要单独拿出来谈论,因为这种做法并不友好,并且有副作用。

  • 所有成员都必须对目标文件执行git update-index --assume-unchanged <PATH>
  • 如果有人改变了目标文件后忘记执行上一个步骤直接push,那么后面拉取的最新代码的成员都需要重新执行git update-index --assume-unchanged <PATH>,否者这个文件又开始被追踪了。

git update-index --assume-unchanged的真正用法应该是这样的:

当你修改一个巨大的文件的时候,每次保存一次Git都要计算文件的变化并且更新工作区,当磁盘速度慢的时候延迟卡顿非常大,这个时候就可以先对文件进行git update-index --assume-unchanged操作,这样Git就暂时不会计算你对文件所做的修改。当你的工作已经完成可以进行提交的时候,重置标识为git update-index --no-assume-unchanged,此时Git只需要进行一次的更新。相较于每次保存都计算一次更新而言,这显然是可以接受的。

总结

经常有人会问 为什么我增加了.gitignore里的规则却没有效果 ,那是因为.gitignore文件只能作用于未跟踪的文件( Untracked Files ),也就是从来没有被Git记录过的文件。所以要先从Git索引中删除对改文件的追踪,才能使.gitignore文件生效。而删除文件的追踪是git rm,这种做法会将本地的物理文件一并删除。如果想要删除追踪状态而非物理文件,可以使用git rm --cached

如果项目有需求,希望 忽略本地文件的修改,但是文件保存在远端仓库的话。 最佳实现是对充当模板的文件在文件名下加以区分。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值