忽略Git中子目录的问题

37

我有一个具有大约5层深度的maven多模块项目。
现在我正在转移到git,并且我发现target文件夹的许多内容被git捕获为“未加入暂存区的更改”。
我已经搜索了很多并查找了SO,但无法找到如何让git忽略target文件夹的整个目录树的答案。
我位于项目根目录下的.gitignore如下:

.project  
.classpath
.settings/
target/
奇怪的是,位于target树下某个位置的.class文件被上述定义忽略了,但像MANIFEST.MFpom.properties或我的应用程序属性文件这样位于target目录树中其他位置的文件则未被忽略。
我已经阅读了Git Ignores and Maven targets,但那个解决方案似乎对我不起作用。
我还可以说,当我尝试添加target/*规则时,它并没有改变任何东西,当我将target/替换为target/*时,.class文件也出现了未暂存状态。
我真的很感激一些指导,因为使用git和maven的人们还没有解决类似的问题,这对我来说似乎非常不可能。谢谢。

1
你在提交代码前是否将target/目录下的文件添加到仓库中了?如果文件已经被Git跟踪,那么将其加入.gitignore文件是无效的。 - KL-7
@KL-7 我的合作伙伴进行了最初的提交,但这似乎可能是问题所在。我会检查并回报。如果是这样,你可以将其发布为答案,我会接受。 - Ittai
3个回答

71

其中一个原因可能是您已将这些文件提交到您的代码库中。在这种情况下,将它们添加到.gitignore并不能阻止 git 跟踪这些文件。要解决这个问题,您首先应该从代码库中删除它们:

git rm -r target/

如果您的项目有模块,您需要包含路径到相关模块的目标:
git rm -r parent_project/module_name/target/

如果您想从仓库中删除目录但不从磁盘中删除,可以使用--cached选项:

git rm -r --cached target/

在任何情况下,您应该将该删除操作提交到存储库中(如果愿意,可以与将target/添加到.gitignore的同一次提交中进行)。


抱歉,我是新手,当我执行 git rm -r --cached target/ 命令时,它只会删除我的本地存储库吗?如果是这样的话,那么我之后需要将本地存储库推送到远程存储库,对吗? - Ittai
是的,首先你需要提交这些更改,然后推送到远程仓库。 - KL-7
关键的陷阱 - “原因之一可能是您已经将这些文件提交到了您的代码库中。在这种情况下,将它们添加到.gitignore文件中并不会阻止git跟踪这些文件。”非常感谢 - Darren Shewry
1
文档中可以了解到,“gitignore”文件的目的是确保Git未跟踪某些文件。要停止跟踪当前已跟踪的文件,请使用“git rm --cached”。 - Ahmad Abdelghany
在过去几个小时里一直苦苦寻找问题,却未能注意到我提交了"Target"文件夹。谢谢! - Pavlos Klonis
显示剩余2条评论

6
target
target/*

在gitignore中添加以下行以忽略target文件及其内部的所有文件。这样就不会再跟踪该文件夹及其内容了。


2
另外,使用 tortoisegit 软件,在目标文件夹上选择“删除并将其添加到忽略列表”即可。

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