社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

【第1739期】为Git仓库里的.idea文件夹正名

前端早读课 • 5 年前 • 697 次点击  

前言

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46623
 
697 次点击