在Git/Mercurial中,我可以安全地忽略Eclipse项目中的.metadata文件吗?

42
我们拥有 Eclipse RCP 应用程序的代码,存在于包含多个 Java 项目的 Eclipse 工作区中。我们正在使用 Mercurial,并有一个简单的 .hgignore 文件,仅包含 *.class(但与 Git 一样会有同样的问题)。
即使对代码进行小小的更改,也会导致 .metadata 中的许多文件发生更改。
我想排除部分或全部 .metadata 的版本控制。如果完全排除它,工作区就会丢失。
有人知道我们可以安全地排除什么吗?或者,如果我们将代码拉到新电脑上,如何重新创建它?

我能理解你是把整个Eclipse工作空间存储在单独的Mercurial仓库中吗?你考虑过把每个项目存储在一个仓库中,然后将它们分组为一个总仓库的子仓库,以便您可以一起对其进行版本控制(尽管我不知道Eclipse是否支持)? - Tom Anderson
这是一个基于插件的产品,每个单独的项目都定义了插件。所有插件都需要一起使用才能组成完整的产品。因此,单独的项目只是整体的一部分,这就是为什么我们希望将整个Eclipse工作区存储在单个存储库中的原因。 - Irish Buffer
5个回答

53

7
一个很棒的项目!不过那个忽略列表有两个问题:一是它会忽略一些你肯定想要检查的内容,比如.classpath;另一个问题是它只针对项目目录内的文件,而原帖的作者想要检查整个工作区。如果你把那个列表应用在整个工作区上,它会(我认为)忽略整个.metadata目录,这会失去一些相当重要的东西,比如项目的.location文件。然而,真正的问题在于Eclipse,它以一种非常不方便的方式混合了权威和派生文件。 - Tom Anderson
那个 Github 文件忽略了整个 .metadata 文件夹。OP 想要保存 .metadata 文件夹的部分内容,以便分享工作区,所以这并没有回答问题。 - endolith

38

元数据和工作区

我绝不会共享.metadata文件夹。实际上,除非您有特定的原因,否则我甚至不会共享工作区文件夹,而是使用git单独分享每个项目。这样.metadata文件夹将始终位于git仓库的父文件夹中,您无需考虑是否需要忽略它:

|-- workspace/
|  \-- .metadata/
|  |-- yourProjectOne/
|  |  \-- .git/
|  |  |-- .project
|  |  |-- src/
|  |  |-- ...
|  |-- yourProjectTwo/
|  |  \-- .git/
|  |  |-- .project/
|  |  |-- src/
|  |  |-- ...

项目特定

你应该始终共享.project文件,而不是共享.settings/文件。 .classpath可能取决于你的环境,但我不建议共享它,因为它可能会导致冲突(例如,如果一个用户使用openjdk,另一个用户使用sun-jdk)。.settings包含eclipse的首选项和设置,并且经常发生更改,因此不应共享它。如果从git克隆后正确导入项目,则也不会有任何问题。

Eclipse文档.project文件的描述如下:

此文件的目的是使项目自我描述,以便将被压缩或发布到服务器的项目在另一个工作区中正确地重新创建。

以及:

如果在包含现有项目说明文件的位置创建了新项目,则该说明文件的内容将被视为项目说明。唯一的例外是,如果文件中的项目名称与正在创建的项目的名称不匹配,则将忽略该文件中的项目名称。如果磁盘上的说明文件无效,则项目创建将失败。

我还建议使用Maven,因为这将节省您许多与依赖关系管理和.classpath文件相关的问题。

Maven

与Maven项目的主要区别在于,您可以将项目导入为Maven->“现有Maven项目”,因此只需要在git中共享pom.xml和.project文件。 Eclipse将自动为您创建.classpath, .settings/文件。因此,显然不需要共享它们。如果pom.xml中有任何更改,则只需运行Maven->“更新项目配置”和Maven->“更新依赖项”。

没有Maven

应该共享.project文件而不是.settings/文件夹。你可以考虑共享.classpath文件,但它可能会导致如上所述的冲突。我建议也不要共享它。使用以下方法导入项目:

在克隆了git存储库之后,您可以简单地使用Import->“从工作区导入现有项目”来导入该项目,eclipse将遵守.project文件,但重新创建.classpath.settings/文件。导入后,您需要手动从Eclipse配置类路径(每当您的团队想要使用其他库时都需要这样做)。

如果您不共享.project文件,则无法使用Eclipse导入该项目。您需要先使用项目向导创建新项目,然后可以选择导入“通用->文件系统”,这将把所有文件复制到工作区中。这可能不是你想要的,因为它意味着你不能将git存储库克隆到工作区中,必须在其他地方克隆它,然后从那里导入它。因此,您应始终共享.project文件。

如果您对此说明有建议或不同意,请留下评论。希望这能对您有所帮助。


使用Maven和m2e,是否有必要共享.project文件? - pioto
2
非常有用的指令。我一直很困惑为什么所有的gitignore文件都包括.project。但是在你的指导下,我决定分享.project。 - einverne

16

我知道的文件有:

  • version.ini (不是很令人激动)
  • .plugins/org.eclipse.jdt.core/variablesAndContainers.dat (类路径变量)
  • .plugins/org.eclipse.core.resources/.projects/*/.location (工作区中的项目)

我有一个用于测试一些与Eclipse相关的工具的Eclipse工作空间,它被严重简化了,但可以使用。我会看看是否能找到它。


1
谢谢!差不多就是这样了。我还得保留.metadata.plugins\org.eclipse.core.resources.root和.safetable。 - Irish Buffer
我还需要添加 .metadata/.plugins/org.eclipse.wst.jsdt.core/variablesAndContainers.dat。 - Ian Kemp

4

工作区元数据真的不应该保存在源代码控制中。基本的工作区配置可以通过团队项目集进行共享。


谢谢,看起来很有前途。我会试一下的。 - Irish Buffer
一个项目设置文件包括应该从哪里检出哪些项目,但不包括其他内容。虽然我不反对你的观点——我认为最谨慎的工作方式是将代码和每个项目的元数据一起提交,而将工作区留在本地控制下——但如果OP坚持共享工作区配置,他可能需要更多的PSF。 - Tom Anderson
汤姆是正确的;那对我没用。PSF包含对(配置错误和不存在的)CVS存储库的引用,我当然无法连接。 - Irish Buffer
你的链接已失效。 - endolith
@MichaelBorgwardt " 未找到主题您请求的主题不可用。链接可能有误,或者您可能没有安装相应的产品功能。此在线帮助仅包括已安装功能的文档。" - endolith

4

我经常保留.project和.classpath文件,它们不仅对git安全,而且很有用。

.class和.settings文件在我的gitignore中。它们是生成的和个人特定的。


1
似乎你说的没错,但我不明白为什么 Github 的 Eclipse 忽略文件中仍然包含 .project 和 .classpath。 - lanoxx
Github的Eclipse忽略文件目前(至少)不包含.project文件,只有.cproject文件。 - Reuben Thomas

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