如何处理在 Git 源代码控制下不断变化的 IntelliJIDEA 项目文件?

我们团队中的每个人都使用 IntelliJ IDEA,我们发现将其项目文件(。知识产权和。Iml)转换为源代码控制,以便我们可以共享构建配置、设置和检查。另外,我们可以在 TeamCity 的持续集成服务器上使用这些检查设置。(我们有针对每个用户的工作区。中的 iws 文件。而不在源代码管理中)

然而,当您在 IDEA 中执行任何操作时,这些文件都会发生细微的变化。在 IDEA 的问题数据库(IDEA-64312)中存在一个问题,因此可能有人会认为这是 IDEA 中的一个 bug,但在可预见的未来,我们将需要解决这个问题。

直到最近,我们还在使用 Subversion,但是最近我们切换到了 Git。我们每个人都已经习惯了有一个项目文件的变更列表,我们忽略了这个变更列表,除非有项目文件变更,我们想与其他人共享,否则我们不会签入这个变更列表。但是对于 Git,真正的力量似乎是(从我们正在探索的内容来看)它所鼓励的连续分支,并且在分支之间切换是一种痛苦,因为项目文件总是被修改。通常它只是以某种方式合并到更改中,并尝试处理现在应用到新分支的项目文件更改。但是,如果新的分支已经更改了项目文件(比如该分支正在处理一个新的模块,而其他分支中还没有这个模块) ,git 就会抛出一个错误,当两个分支都发生了更改并且您在本地发生了更改时,将其合并到文件中没有任何意义,我可以理解它的意思。在命令行中,我们可以使用“-f”来强制 Git Checkout 命令抛出本地更改并使用分支的更改,但是(1) IDEA 中的 Git Checkout GUI 命令(10.5.1)似乎没有这个选项,所以我们需要定期切换到命令行。(2)我们不确定是否想要养成使用这个标志并告诉 Git 抛出本地更改的习惯。

所以,这里有一些想法,我们有一些选择,我们必须处理这一点:

  1. 完全脱离源代码控制的项目文件。把它们放进。并通过其他方式将它们分发给每个人和 TeamCity,可能通过将它们放在其他地方的源代码管理中或以其他名称进行分发。我们的团队足够小,这个选择是可行的,足以考虑,但它似乎不是很大。
  2. 继续使用它,尝试确保在给定的时间管理关于哪些分支的哪些文件。作为其中的一部分,我们可以鼓励每个开发人员在他们的系统上拥有每个项目的多个副本,这样他们就可以使用可能不同的项目文件集将每个项目签出到不同的分支。
  3. 试着只做这个项目(。在源代码管理中,使用模块(。Iml)不在源代码管理和。吉蒂诺档案。主要的事情似乎在自己转换。定期使用 ipr 是共享构建配置的顺序,但也许我们可以分别共享关于如何设置这些配置的信息。我不太确定 IDEA 是如何处理这种只有一些文件的情况的,特别是在一个新的结帐时。

我想我希望有一些明显的(或不明显的)解决方案,我们已经错过了,也许处理巨大的可定制性,Git 和 IDEA 似乎都有。但似乎我们不可能是唯一有这个问题的球队。与 Stack Overflow 类似的问题包括 349519110005123873872,但是我不知道它们是不是完全一样的问题,也许有人可以提出我列出的各种方法的优缺点,这些问题的答案中列出的方法,或者他们推荐的方法。

73128 次浏览

我们的团队不检入特定路径的 IntelliJ 文件。我们假设人们知道如何使用 IDE 并设置项目。IntelliJ 文件进入“忽略”更改列表。

更新:

现在我使用 Maven 及其默认目录结构,这个问题的答案就简单多了。

应该要求 IntelliJ 忽略 /.svn/.idea/target文件夹中的所有文件。与个人路径信息有关的所有信息都存储在 /.idea中。

对于 Subversion 或 Git 来说,其他一切都是公平的。

您可以使用 IDEA 的 基于目录的项目结构,设置存储在。目录,而不是。知识产权文件。与版本控制中存储的内容相比,它提供了更多的 细粒度控制细粒度控制。那个。Iml 文件仍然存在,所以它不能解决它们中的随机更改(也许可以将它们置于源代码控制之外?),但是共享代码样式和检查配置文件等内容很容易,因为它们中的每一个都将在。概念目录。

我将 workspace.xml 从源代码控制中移除(+ 添加到. gitignore 中)。

官方文件: http://devnet.jetbrains.com/docs/DOC-1186

根据 IntelliJ IDEA 项目格式(基于. ipr 文件或 . IDEA 目录) ,你应该把下面的 IntelliJ IDEA 版本管制下的项目档案:

基于. ipr 文件的格式

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

。想法目录为基础的格式

共享项目根目录下.idea 目录下的所有文件,除了 存储特定于用户的 workspace.xml 和 tasks.xml 文件 设置,还共享所有的.iml 模块文件。

我把它放在我的. gitignore:

#Project
workspace.xml
tasks.xml

假设您使用的是现代的(现在默认的) .idea文件夹项目格式:

  • 加上一切。
  • 除了 .idea/workspace.xml(它是特定于用户的)
  • 除了 .idea/tasks.xml(它是特定于用户的)
  • 除了一些可能包含密码/key/etc 的其他文件(有关详细信息,请参阅上面的链接)

这个 Gitignore 文件可能是一个有用的参考,尽管您仍然应该阅读上面的链接,以了解为什么会出现这些条目,并决定是否需要它们。

我个人也忽略 .idea/find.xml文件,因为这似乎改变每次执行搜索操作。

只是为了分享我的团队使用的另一种方法: 只需将任何 IDE 相关文件移动到 IntelliJ 不能识别的不同位置,并创建一个脚本将它们复制到 GIT 忽略的所需的“活动”位置。

这种方法的好处是可以保留通过版本控制共享 IDE 设置的选项。唯一的缺点是您必须决定何时运行脚本(可能是每个工作区克隆一次或者需要更改的时候) ,并且您可以通过将脚本合并到您的构建过程中或者合并后的钩子中来实现这一点。

这种方法依赖于 IntelliJ 只搜索其设置文件的特定位置,因此它也适用于框架配置文件。实际上我们忽略了圣杯。属性文件,这样开发人员就不会意外地签入他们的本地配置更改。