如果使用Maven,VCS中的Eclipse特定文件应该被忽略吗?

11

我知道为什么不应该将Eclipse/IDE特定的文件提交到像Git这样的版本控制系统中(实际上我正在使用Git)。这就是我使用Maven并让它为您生成这些文件而不将其纳入版本控制的原因之一。

但我想知道,这些文件是否应该在.gitignore中被忽略,而.gitignore本身又受到VCS/Git的控制:

.classpath
.project
.settings/
target/

这样做是否可行?

由于在 .gitignore 文件中忽略的文件是特定于 IDE 的,因此它本身也会变得与 IDE 相关。这种方法的利弊如何?有没有最佳实践?

4个回答

12

在我所工作的团队中,通常的规则是不要检入由Maven生成或获取的任何内容。因为pom.xml文件包含了创建.project、.classpath和.settings文件所需的一切,所以我们不会将它们检入。

我的.gitignore文件始终包含Maven项目的.classpath、.settings、.project和target。

编辑:如我下面的评论所提到的,这里有另一个建议:如果你真的想避免在.gitignore文件中包含Maven或IDE专用条目,那么可以尝试编写.gitignore文件以仅列出您需要检入的文件,而不是忽略文件

*
!stuffIDoWantToCheckIn

通过按照您在我的问题中描述并指出的方式检查 .gitignore,您间接地检查了由 Maven 生成的文件的数据。 - SimonTheSorcerer
4
你过于深思熟虑了。我的观点是你不想检查由Maven生成的任何内容。(此外,我的.gitignore不是由Maven生成的。)将特定于IDE的文件、输出文件夹和任何不希望检查进版本控制的文件都放在.gitignore文件中是没有问题的。事实上,这就是.gitignore的全部意义所在。 - Lawrence McAlpin
然而,如果你真的不想在.gitignore中包含IDE或Maven特定的排除项,也许你可以尝试放入否定条目来指定只有需要检查的内容。我自己从未这样做过,但你可以在.gitignore中放入*来忽略所有内容,然后添加以!开头的行来列出例外情况[意味着这些条目会被检查]。https://dev59.com/fnM_5IYBdhLWcg3wq1GF - Lawrence McAlpin
1
我会选择这个答案并将我的.gitignore更改为以下内容:* !src !pom.xml !.gitignore - SimonTheSorcerer
我将选择这个答案并更改我的.gitignore为以下内容:* !src !pom.xml !.gitignore(抱歉缺少换行符)。我想说的原因是:**1.**初始的.gitignore文件对于每个使用的IDE来说都是简单且通用的。 **2.**排除了提交特定于IDE的文件的可能性,没有开发人员需要为他们最喜欢的IDE烦恼.gitignore。 **3.**澄清了什么属于存储库。 - SimonTheSorcerer
1
我不知道自原回答发布以来是否有所更改,但是根据本评论,在任何子文件夹(例如src文件夹)需要取消排除时,您需要在文件开头使用/*而不仅仅是*。因此,例如:/* !.gitignore !build.gradle !src/ - nerdherd

2
我从以下文章获取信息:https://help.github.com/articles/ignoring-files 该文章建议您可以创建一个全局gitignore文件(在~/.gitignore_global下),其中包含.project等。由于该文件位于存储库之外,因此不会显示...
您可以使用以下命令将其注册为全局忽略文件:
git config --global core.excludesfile ~/.gitignore_global

或者,您可以在.git/info/exclude文件中为每个存储库创建未跟踪的gitignore条目。


1

我同意不将IDE文件放在版本控制下,这可能会导致各种问题。就像你提到的,使用maven可以使此操作变得不必要,因为任何开发人员都可以从POM中导入项目并开始工作。

如果这些文件没有放在.gitignore中,就有可能因疏忽而被检查进来。

此外,我认为在.gitignore中列出它们并不会使其特定于IDE,如果团队成员使用混合不同IDE,则可以在同一个.gitignore中列出eclipse、IntelliJ IDEA和Netbeans的项目文件。随着时间的推移,您可能会积累一个模板.gitignore,以忽略您团队中使用的所有IDE的项目文件,每当您创建新存储库时使用它。

如果您完全反对将这些文件放入项目的.gitignore中,您可以将它们放入用户的.gitignore中,但在我的看法中,这会更松散,因为它取决于个人开发机器的正确配置,并且还需要维护这些内容以保持与任何新加入的同步。

编辑:我目前有一个等效的.hgignore,相同的概念不同的语法,我将其转换为git作为.gitignore文件的示例。

/target/
/bin/
/build/
/.classpath
/.project
/.settings/
/.checkstyle
/atlassian-ide-plugin.xml
/.idea/
/*.iml
/*.ipr
/*.iws
*.orig
*.swp
*~

你能提供一个.gitignore模板吗? - SimonTheSorcerer
谢谢。与被接受的答案相比,你的 .gitignore 看起来更加复杂,需要更多维护。想象一下,如果 Maven 支持一个新的 IDE,并且你需要修改所有项目的所有分支中的 .gitignore 文件,以供使用该 IDE 的开发人员使用。 - SimonTheSorcerer

0

通常情况下,应该将 .project 和 .settings/ 版本化并忽略!

.classpath 和 target 不应该被版本化,而是应该被忽略。

这是在 checkout-practice 上的第一次初始启动。

例如:

  • 你告诉每个人使用四个空格作为制表符,这些信息存储在 .settings/xxx 下
  • 但你没有限制他们必须在哪里安装他们的 tomcat/jdk(存储在 .classpath 下)

好吗?


1
我从未听说过版本控制和忽略文件。这会产生什么样的影响? - SimonTheSorcerer
我认为版本控制设置对任何人都没有帮助。根据您使用的插件,可能会有任何内容(缓存、机器甚至是文件系统相关的内容等),因此我会一直忽略它们。我希望Eclipse来管理这些,是的,我需要一种重新创建它们的方法。 - mliebelt
@SimonTheSorcerer 你可以强制只下载一次,而不上传。这种做法是用来告诉新手一个项目需要绑定什么的。这些新手将无法提交他们的配置! - Grim
@PeterRader 我认为这是一个不同的用例,但也是我遇到的另一个问题的答案(我想暂时需要更改.gitignore来更改这个“新手”模板)。所以感谢你指出这一点。 - SimonTheSorcerer
@PeterRader 我尝试了这个方法,但不幸的是并没有奏效。如果一个被版本控制的被忽略的文件发生更改,Git会询问是否提交。但这已经偏离了主题,你在哪里可以找到相关信息呢? - SimonTheSorcerer

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