前言

.idea该不该提交到代码仓库中呢?你的意见呢?今日早读文章由《Flask Web开发》作者@李辉分享。

正文从这开始~~

在网络上,我曾多次看到人们对于Git仓库中的.idea文件夹的偏见。最近的一次是在某个博客中技术专家对于志愿者提交的项目的点评,其中在“项目规范”中有一条加分项为“没有 .idea 这种不该上传的文件夹”;另一次是在知乎评价某程序员的问题下某个回答的评论中,有人发现该程序员的GitHub仓库里有.idea目录,就居高临下的将其作为理由讽刺该程序员,潜台词即“项目里有.idea = 水平低下”。想当然的,我没看到的类似情况会更多,而这些观点又会影响很多不熟悉具体事实的人,我想我应该尽一份力来改变这个错误的观点继续蔓延。

提示 尽管本文的标题使用了Git,本文的内容同样适用于其他VCS(Version Control System,版本控制系统)。

什么是.idea文件夹

当你使用JetBrains出品的IDE(Integrated Development Enviroment,集成开发环境)时,比如PyCharm、WebStorm或IntelliJ IDEA等,它们会在创建项目后在项目根目录创建一个.idea文件夹,其中保存了项目特定的配置文件。

至于为什么命名为.idea,则是因为IntelliJ IDEA是JetBrains最早推出的IDE(JetBrains一开始叫IntelliJ),因此使用IDEA作为配置文件夹的名称。按照这个SO问题里最高票答案的猜测,或许IntelliJ IDEA这个名字的含义是这样组成的:

  • Intelli ===> Intelligent

  • J ===> Java

  • Idea ===>IDE that is Advanced or Idea just means idea( I have a good idea ...like this ) ...

是否应该把.idea提交进Git仓库

这个问题没有唯一的答案,在Stack Overflow有很多类似的讨论。总的来说,开发者可以自由选择是否把IDE相关的配置文件(这里即.idea目录下的文件)提交到Git仓库中:

如果你想让其他使用相同IDE的用户可以更方便或规范的对项目进行开发,那么就把它提交到Git仓库中。比如,你可以设置文件模板(.idea/fileTemplates),定义代码风格(.idea/codeStyleSettings.xml),定义检查器(.idea/inspectionProfiles/),这样其他开发成员可以很方便的上手项目,这会比写在“贡献指南”约束性强一些。

如果你觉得Git仓库不应该包含和项目本身无关的文件,那么也可以不将它提交到Git仓库中。

正确的提交方法

当然,将.idea目录整个提交到Git仓库的行为并不可取。因为.idea目录下的文件中有包含隐私的内容(比如你的文件操作变动、用户词典、系统环境变量、数据库密码等等),或是临时生成的文件,这些文件对项目其他的参与者没有用处,而且会泄露你的隐私或是影响正常开发。

如果你选择将.idea目录提交仅Git仓库,那么需要稍微多付出一些工作。

按照JetBrains官方的建议,在使用VCS时提交.idea文件夹应该遵循下面的原则:

1. 分享下面的文件:

除了workspace.xml、usage.statistics.xml和tasks.xml以外.idea目录下的所有文件 所有可以被在不同模块目录下定位到的.iml模块文件(适用于IntelliJ IDEA)

2. 谨慎分享下面的文件:

Android artifacts that produce a signed build,因为它们包含keystore密码(前半句不理解,暂时保留原文)

在IntelliJ IDEA 13 和之前的版本中的dataSources.ids和datasources.xml文件,它们包含数据库密码

3. 避免分享下面的文件:

对于使用Gradle或Maven的项目,避免分享.iml和.idea/modules.xml文件,因为它们会在导入时生成gradle.xml文件

用户字典(dictionaries文件夹)

.idea/libraries目录下的XML文件,因为它们会从Gradle或Maven项目中生成

4. 另外,对于旧的项目格式(.ipr/.iml/.iws files)来说:

分享项目.ipr文件和所有的.iml模块文件,不要分享.iws文件,因为它存储用户特定设置。

对于Git,你可以参考GitHub提供的JetBrains适用的.gitignore模板。

我的还没上市的新书中包含多个Flask项目,这些项目中的.gitignore文件则是通过gitignore.io来生成的。你可以在gitignore.io主页的输入框中输入你使用的操作系统、编程语言和IDE,它会快速为你来生成一份适用这些语言和平台的.gitignore规则,比如下面三个模板分别对应三个操作系统下的PyCharm开发环境:

  • macOS + Python + PyCharm

  • Linux + Python + PyCharm

  • Windows + Python + PyCharm

你可以在这些模板的基础上添加自定义规则。

有选择的提交.idea的好处

在评论区,已经有很多知友给出了反对提交.idea文件夹的,或是说反对将IDE配置提交到Git仓库的理由。我没有太多开发经验,没法一一进行解释。首先,我在前面已经说到,这件事情包含很大争议,你可以自由选择做与不做。但是我还是想为提交

  • .idea/vcs.xml

  • .idea/fileTemplates/

  • .idea/inspectionProfiles/

  • .idea/scopes/

  • .idea/codeStyleSettings.xml

  • .idea/encodings.xml

  • .idea/copyright/

  • .idea/compiler.xml

总结

如果你不想在Git仓库中提交IDE相关的配置文件,那么你可以忽略.idea文件夹;相反,你也可以有选择的把.idea目录下的文件提交进Git仓库。也就是说,项目Git仓库中是否包含.idea文件夹与程序员的开发水平并没有直接关系。

水平高低不知道,反正这么多开源项目没见过一个有.idea的

“这么多”是多少?先不说BitBucket等其他平台,光Github上的开源项目就有6700万(数据来自GitHub 2017报告)。在Google搜“tree/master/.idea site:github.com”有约15万结果,就算去掉5万不相关结果,10万不多吗?

可现实是有idea的基本都是垃圾代码。新手想不到这么细也没有那个耐心去一一甄别,再将其添加到ignore里面,老手讲究项目通用性也不会将idea上传。idea里面的东西对人类来说多是不可读(不友好)的,还会干扰正常的项目配置。

在Google搜“tree/master/.idea site:github.com”的15万结果里,假如把Stars数量作为项目质量评价标准的话,前几页就可以看到这些包含.idea且Stars超过1000的项目(链接后为Stars数量):

  • clojure/clojure 7192

  • Day8/re-frame 3243

  • JetBrains/kotlin 22905

  • corda/corda 1988

  • ktorio/ktor 2896

  • airbnb/epoxy 4070

  • mattgodbolt/compiler-explorer 4246

  • AnalyticalGraphicsInc/cesium 3245

  • http4s/http4s 1106

现实是有idea的基本都是垃圾代码

我并没有看到这种情况。

新手想不到这么细也没有那个耐心去一一甄别,再将其添加到ignore里面

我承认这是现实。如果看到这篇文章的新手想要选择把.idea提交到Git仓库,那么我在文章中已经介绍了如何方便的创建合适的.gitignore规则。

老手讲究项目通用性也不会将idea上传

上面列出的这些项目都是新手创建的?

idea里面的东西对人类来说多是不可读(不友好)的,还会干扰正常的项目配置。

.idea里文件基本均为XML文件,XML不可读?我在XML的维基百科词条看到XML的介绍是“XML is a markup language that defines a set of rules for encoding documents in a format that is both human-readable and machine-readable.”,可以看到XML的设计理念就是同时对人类和机器来说都具备可读性。通过我在文章里介绍的方式生成对应的.gitignore规则并不会干扰正常的项目配置。

这个可能你会需要:https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore

关于本文 作者:@李辉 原文:https://zhuanlan.zhihu.com/p/38348372

为你推荐

【第1707期】谈谈 Git Merge 和 Git Rebase 的应用

【第1623期】30分钟让你掌握Git的黑魔法

.gitignore文件_【第1739期】为Git仓库里的.idea文件夹正名相关推荐

  1. 从git仓库中删除.idea文件夹的小技巧

    这篇文章主要介绍了从git仓库中删除.idea文件夹的小妙招,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 如果不配置.gitignore的文件,带push ...

  2. gitbash登录码云报错_手把手教你入门git仓库和关联码云

    gitHub(国外)和Gitee(码云,国内的) 环境配置教程 注册码云账号和git安装教程的具体指导(生成密钥,环境配置,绑定邮箱用户) 百度网盘下载链接(.pdf文件):https://pan.b ...

  3. xftp如何搜索文件_头条搜索站长平台如何添加网站和sitemap文件?附图文教程

    头条搜索站长平台已经上线了,目前我们广大站长都可以登录该平台后添加新网站和提交 sitemap 地图文件,建议大家可以前往尝试一下,多一个搜索平台就多一条路,认为倒是挺好的.下面就跟大家简单介绍头条搜 ...

  4. 保存多序列tiff文件_干货技巧!如何使你保存的Phtoshop文件容量更小?

    设计师使用Photoshop储存文件时,保存的文件时可能会占用过多的磁盘空间,并且发送或者下载PSD文件的时候也会花费太多的时间,那么我们有些什么方法技巧可以缩小,或者优化我们的PSD文件呢?我们以一 ...

  5. 转储sql文件_在Linux上SQL Server中更改SQL转储文件位置

    转储sql文件 In this article, we will talk about SQL Dump files and the process to change the dump direct ...

  6. h5页面如何预览excel文件_如何使用JavaScript实现前端导入和导出excel文件?(H5编辑器实战复盘)...

    前言 最近笔者终于把H5-Dooring的后台管理系统初步搭建完成, 有了初步的数据采集和数据分析能力, 接下来我们就复盘一下其中涉及的几个知识点,并一一阐述其在Dooring H5可视化编辑器中的解 ...

  7. java内存中读文件_关于内存管理:读取Java中的大文件

    我需要一个非常了解Java和内存问题的人的建议. 我有一个大文件(大约1.5GB),我需要将此文件切成许多小文件(例如100个小文件). 我通常知道如何做到这一点(使用BufferedReader), ...

  8. python播放音频文件_详解使用pygame播放一段MP3音频文件

    近日,在梳理pygame模块的时候发现一个很有用的模块mixer模块,这个模块翻译过来就是混音器,它可以加载和播放音频文件,甚至可以对混音器进行设置和处理,其功能非常强大.今天,我们一起来梳理一下混音 ...

  9. python库读取cif文件_技术专栏:一篇文章搞懂晶体学信息文件CIF及其获取方法

    [引语]材料人现在设立各种文章专栏,所涉及领域正在慢慢完善,由此也需要更多的专栏作者,没错,我们正在招兵买马,期待你们的加入,有意向的小伙伴可直接联系cailiaorenVIP.不要再犹豫,下一个专栏 ...

最新文章

  1. 嵌入式软件工程师笔试题(含答案)
  2. django mysql connector_MySQL Connector / Python作为Django引擎?
  3. day17-jdbc 6.Connection介绍
  4. 设计模式之_Iterator_03
  5. C语言字符串压缩显示
  6. PHP的安装与设置——windos
  7. webservice生成客户端的方法
  8. ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步
  9. 战术网络安全检查表 | Symantec Connect
  10. 生产环境下 RocketMQ 为什么不能开启自动创建主题?
  11. 越看越爽,此后统计学习不再是路人!
  12. 数据库设计(三)——数据库设计规范
  13. winform 企业ERP管理系统源码 c# C/S
  14. Pr 音频效果参考:延迟与回声
  15. DMA方式的数据传送过程
  16. 国产科幻惊悚电影《太空群落》视效制作大放送
  17. 阿里智能运维平台的演进:从自动化到无人化(附PPT)
  18. 创建守护进程的步骤与练习,每隔1s向time.log写入系统时间!
  19. 操作系统物理内存使用率高的解决方法
  20. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

热门文章

  1. Springboot2.x +JPA 集成 Apache ShardingSphere 分库分表
  2. 正则表达式简单语法及常用正则表达式
  3. 自定义Valid注解,校验List集合
  4. 小程序开发(10)-之热力图解决方案、手绘图
  5. JavaScript-获得和设置表单的值
  6. arp 华为 查看 路由器_华为路由器运行状态查看-路由器
  7. l3asnumanode 设置_linux numa 配置
  8. python treeview文本自动换行显示_在tkinter.ttk.Treeview列中设置文本格式
  9. opencv论坛_Opencv批量添加logo的解决方案
  10. promise用法_图解 Promise 实现原理(四):Promise 静态方法实现