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