因为项目迁移的原因,遭遇了一些ignore的问题,就想趁机会把这个忽略的规则搞清楚,期间搜索到了很多信息,多是让清楚缓存,即git rm -r --cached .idea,但是没有详细的解释,所以翻到了这一篇文章:https://github.com/wujunchuan/wujunchuan.github.io/issues/18,总结的非常全面,下面是具体内容。
.gitignore
的一些用法。其实.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.example为database.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 update-index --assume-unchanged
操作,这样Git就暂时不会计算你对文件所做的修改。当你的工作已经完成可以进行提交的时候,重置标识为git update-index --no-assume-unchanged
,此时Git只需要进行一次的更新。相较于每次保存都计算一次更新而言,这显然是可以接受的。
总结
为什么我增加了.gitignore里的规则却没有效果 ,那是因为.gitignore
文件只能作用于未跟踪的文件( Untracked Files ),也就是从来没有被Git记录过的文件。所以要先从Git索引中删除对改文件的追踪,才能使.gitignore
文件生效。而删除文件的追踪是git rm
,这种做法会将本地的物理文件一并删除。如果想要删除追踪状态而非物理文件,可以使用git rm --cached
忽略本地文件的修改,但是文件保存在远端仓库的话。