Android Studio - 整个.idea目录应该被添加到Git的忽略列表中吗?

151

我看到很多与 AndroidStudio 相关的 .gitignore 文件示例,其中一些包含 .idea,而另一些则没有。

不将整个 .idea 目录添加到 .gitignore 中是否有充分的理由?

如果不应该完全忽略它,那么 .idea 目录中是否有特定的文件(例如 .iml)应该在 .gitignore 中?


我忽略 .idea 目录,除了 .idea/runConfigurations/ 目录下的一些文件。 - Daniel
1
超集:https://dev59.com/z2Qn5IYBdhLWcg3wj3zz - Ciro Santilli OurBigBook.com
4个回答

112
您可以查看此页面: IntelliJ 关于项目配置文件的文档
在 "基于目录的格式" 中,一个特定的行非常有趣:
.idea 目录包含一组配置文件(.xml)。每个文件仅包含与某个功能区域相关的部分配置数据,该功能区域反映在文件名中,例如,`compiler.xml`、`encodings.xml`、`modules.xml`。
几乎所有文件都包含与项目本身核心有关的信息,例如其组件模块的名称和位置、编译器设置等。因此,应该(并且应该)将这些文件放置在版本控制下。
然而,我很讨厌使项目依赖于 IDE (我目前正在使用 NetBeans 制作项目,使用 Eclipse 进行开发却很痛苦,Eclipse 成为了我的公司标准)。
所以,回答您的问题:
1. 如果您不使用像 Maven 或 Gradle 之类的工具来管理依赖项和构建:将目录保留在版本控制下。这样,项目和依赖项的正确配置将对每个人都可用。相反,所有开发人员都必须按照您在配置文件中定义的方式完全设置他们的环境。
2. 如果您使用 Maven 或 Gradle 之类的工具:正确地配置这些工具并不要将目录保留在版本控制下。实际上,所有包含在配置文件中的信息应该存储在 Maven/Gradle 文件中。然后让您的开发人员根据他们的环境配置他们的 IDE。这样,使用 Eclipse、IntelliJ、Linux、Windows 等就不再是一个问题了。

9
请注意下面这段话:“例外是文件workspace.xml。它存储了您的个人设置……因此,您不太可能想与同事分享这个文件。”请注意,不要改变原文的意思。 - Dalbergia
1
如果您在答案中添加了在gitignore文件中执行此操作所需的代码行,那将是非常好的。对于新手来说,添加正确的指令可能有些困难。 - carloswm85

43

好的,经过一些“是”和“否”的回答,我现在添加一个“是和否”的答案 :)

问题在于 .idea 既用于项目构建配置(依赖声明),也用于项目设置(检查等)。

您绝对不希望使用IDE进行构建配置,但您可能希望团队共享设置。这就是为什么您需要仅忽略.idea内容的一部分(如 libraries 文件夹和 modules.xml 文件),但保留版本控制中的其他部分(例如 copyrightdictionariesinspectionProfiles 文件夹和文件,以及位于 .idea 下的dynamic.xmlcodeStyleSettings.xml 等文件)。


如何具体处理 iml 文件? - dors
1
iml文件绝对应该被忽略。 - JBaruch
1
我仍在思考配置不应保存在依赖于IDE的文件中,因此Maven/Gradle更适合此任务。 - mithrop
@mithrop,问题在于 - 你无法在Maven/Gradle文件中声明此类型的配置。这是Idea自己的专有格式,在Maven/Gradle中没有可移植的替代方案。 - JBaruch
没错,你说得对。无论如何,如果不能将它放在maven/gradle文件中,下次在另一个IDE中导入项目时就会遇到问题(这是我最讨厌处理的问题)。但我完全同意你的观点(如果读了我的回答,你会发现我真的是这样认为的):根据你的需求选择是否包含这些文件 :) - mithrop
@mithrop,我们的答案有些不同。我认为即使你进行了正确的依赖管理,你仍然需要提交一些文件。 - JBaruch

7
将项目配置保存在VC中的概念是可行的。我和我的团队这样做是因为我们所有的开发人员都使用PHPStorm进行项目开发,所以保持一个共同的配置是有意义的……从概念上来说。我们想要使用相同的字典文件、相同的编码规范和相同的插件配置。
我之所以用“从概念上”来限定这个概念,是因为JetBrains的.idea文件夹存在问题,这导致我们无法使用它。这些问题可能是可以避免或修复的,但我们不清楚如何正确地解决它们,我们认为这是JetBrains的错误,因为作为开发者,我们没有时间也没有愿望去寻找解决方案,使我们的IDE能够正常工作。
话虽如此,我们遇到的问题如下:
  • 符号链接项目文件夹无法正常工作。 当我设置我的项目时,我将它们链接到我的主目录中。我们发现的问题是,该项目被设置为使用确切的符号链接,而不是只把它视为一个具体的目录。这意味着如果另一个开发者将他的项目放在不同的位置,或者根本不使用符号链接,整个目录将在项目导航器中消失,因为它实际上正在查找符号链接。更糟糕的是,我从未在配置中找到过这个路径值。我们无法在构成我们的.idea文件夹的文件中找到确切的配置。
  • 定义文件默认被分配给用户。这意味着如果我想将一个单词添加到我的字典中,它将被列为我的定义,但其他用户将有自己的定义部分。对于其他用户,这些标记单词仍然会显示为拼写错误。这是不可取的。我之所以将其添加到我的定义文件中,是因为IDE是错误的。我希望这些定义能够直观地与其他用户共享。
  • 同事们一直在覆盖配置,因为他们的IDE会用当前在内存中的配置来覆盖配置。我的意思是,开发者正在工作,并合并他们从origin获取的代码库,其中包含一个项目配置更改,而不是他们的IDE更改配置,或者甚至给他们一个选择,它会自动用当前在内存中的IDE配置来覆盖.idea配置。在我看来,如果IDE立即用当前在内存中的配置覆盖它,那么.idea配置就不能用作共享配置。为了解决这个问题,开发者必须关闭他们的IDE实例,拉取代码库,然后重新打开他们的IDE。如果IDE立即用当前在内存中的配置覆盖它,那么保持共享配置就没有意义。这就像根本没有共享配置一样。
我以前曾经用Visual Studio和Netbeans在VC中做过这些类型的共享IDE配置,而且一直都很好用;但是对于.idea来说,它感觉根本无法使用,这让人失望。我希望JetBrains能够掌握它,并使其成为更好的用户体验。

而不是让IDE更改配置或者给他们选择,它会自动使用当前IDE中的内存配置来覆盖.idea配置文件。哇,那真的很不幸。好知道! - Greg Price

1
作为对这个问题的解释的补充,GitHub 的 .gitignore 模板 for Android 包含以下文件:
# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml

注意,这是来自JetBrains关于如何在版本控制系统下管理项目的指南(How to manage projects under Version Control Systems)中的一条记录,涉及与其他开发人员共享IDE项目文件:
需要共享的内容: 除了存储用户特定设置的项:workspace.xml、usage.statistics.xml和架子目录之外,项目根目录下.idea目录中的所有文件。

也许我在这里漏掉了什么,但如果我排除 gradle.xml,那么我的项目的用户如何知道要使用哪个 gradleJvm? - Chucky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接