前言
.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的黑魔法