十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Git忽略文件完全指南:IDEA下.gitignore配置从入门到实战

Git忽略文件完全指南:IDEA下.gitignore配置从入门到实战 作为一个天天跟 Git 打交道的开发者我敢说十个人里有八个都遇到过这种尴尬时刻写完代码往远程仓库一推猛然发现 .idea 里的 workspace.xml 或者 target 目录下的编译产物被一并推上去了。更离谱的是有时候明明在 IDEA 里勾掉了某个文件结果下次提交它又冒出来了。今天这篇就把 IDEA 下 Git 忽略文件这件事彻底讲透从原理到实操从语法到踩坑一篇全给你说明白。1. 为什么非要用忽略文件一次代码提交引发的“事故”1.1 版本控制不只是“提交代码”这么简单很多刚接触 Git 的开发者都有一个误区觉得版本控制就是把代码传到远程仓库。但 Git 的本质是跟踪项目里所有文件的变化这个“所有”是非常实在的——只要文件没有被明确排除它就会进入 Git 的跟踪范围。这就带来一个问题一个现代 IDE 项目尤其是 IntelliJ IDEA 项目的文件构成非常复杂里面既有源码也有大量“不是源码”的东西。以最常见的 Java/Maven 项目为例源码目录 src/main/java 和 src/test/java 是要跟踪的pom.xml 是要跟踪的.idea 目录里存放着 IDEA 的项目配置比如工作区布局、代码风格、断点信息target 目录里是编译输出class 文件、jar 包、测试报告、临时文件都在里面。如果你不加任何限制Git 会把所有这些一股脑全记录下来。这就好比你写日记结果把书桌上每一张便利贴、每一根掉落的头发丝都粘进了本子里日记本很快就没法看了。1.2 不忽略文件会踩到什么坑先讲一个我亲身经历的案例。有一年我给公司项目加了一个本地调试用的配置文件里面写着测试数据库的账号密码。当时急着下班随手就提交了也没注意 .gitignore 没有把那个文件筛掉。第二天早上项目经理说线上仓库里出现了敏感信息虽然最后通过 reset 和 force push 把记录抹掉了但这个过程非常折腾而且理论上如果仓库是公开的信息可能已经被爬虫抓走了。除了这种安全事故不忽略文件的另一个典型问题是提交记录极其混乱。IDEA 的 .idea 目录里有一个 workspace.xml它记录的是你个人的窗口布局、最近打开的文件、运行配置这些内容在你每次调整 IDE 窗口大小、切换标签页的时候都会变。如果这个文件被跟踪那么你在代码里改一行字Git 状态面板里可能同时出现十几个文件的变更其中大半都是 workspace.xml 带来的噪音。代码评审的人看到这种提交第一反应就是想打人。还有一类容易踩的坑是环境相关的文件。比如 .env 文件、application-local.yml、本地缓存目录等这些文件和机器、账号、运行环境强相关。别人拉下来你的代码这些配置大概率用不了反而会造成误导。用 .gitignore 把这些文件筛掉才是一个负责任的做法。1.3 忽略文件的底层机制Git 的“好奇”与“克制”Git 默认是一个“好奇宝宝”凡是项目目录里出现的文件它都会纳入跟踪。查看文件状态的命令是 git status未跟踪文件会显示在 Untracked files 区域。而 .gitignore 文件的本质就是一份“黑名单”告诉 Git哪些路径、哪些模式的文件你不要管。这个机制生效的时机要先搞清楚git status 检查文件状态、git add 添加文件时Git 都会先拿文件路径去和 .gitignore 里的规则比对。只要匹配上了文件就会在未跟踪列表中消失git add 也不会把它们加进暂存区。但是已经跟踪过的文件.gitignore 是管不了的。这一点很重要后面讲“已提交文件的处理”时专门会说到。.ignore 相关文件.gitignore 是 Git 使用的IDEA 还支持 .ignore 插件管理多种版本控制工具的忽略规则从文件系统角度来看就是一个普通文本文件它放在仓库根目录下可以随代码一起提交给所有协作者分享。这样大家 Clone 下来之后忽略规则是自动生效的不需要每个人在本地手动配置。这也是 Git 忽略机制比 SVN 那种全局忽略更优雅的地方。2. .gitignore 规则语法精讲从入门到“一眼看懂别人写的规则”2.1 基础语法通配符与匹配规则.gitignore 的语法并不复杂但有几个细节值得认真说。每一行代表一条规则空行和以 # 开头的行会被忽略# 是注释。核心语法包括*匹配任意多个字符但不匹配路径分隔符。比如*.log能匹配根目录的 a.log也能匹配子目录里的 b.log但如果你写的是*/*.log那就只匹配一层目录下的 log 文件。**匹配任意层级目录。**/target/能匹配根目录的 target、一级子目录的 target、以及任意深度的 target 目录。?匹配单个字符。比如test?.txt能匹配 test1.txt但不能匹配 test12.txt。[abc]字符集合匹配[a-z]表示小写字母。这个用得不多但了解后能看懂一些复杂规则。/开头表示只匹配项目根目录下的路径。比如/target只忽略根目录的 target而target不带斜杠则表示忽略任意层级的 target。/结尾表示只匹配目录。比如target/表示忽略所有叫 target 的目录但如果有个叫 target 的文件它不会被忽略。!开头表示取反也就是重新包含。这个要特别小心Git 有一个坑爹的限制如果某个父目录被忽略了那下面的文件即使写了取反规则也无法恢复。比如你忽略了build/那么!build/important.txt是不生效的因为 Git 压根不会进入 build 目录去看。2.2 进阶技巧规则的优先级和“就近原则”一个仓库里可以存在多个 .gitignore 文件根目录放一个通用的子目录放一个针对该目录的特殊规则。Git 处理时遵循“就近原则”子目录里的 .gitignore 规则会覆盖父目录里的规则。不过日常开发中绝大部分项目在根目录放一个文件就足够了过度拆分反而增加维护成本。规则之间也有优先级。同一路径如果被多条规则匹配Git 会按“最后一个匹配的规则为准”来处理而不是“最长匹配优先”。这意味着如果你在文件前面忽略了一个目录后面又写了取反规则取反规则要放在后面才可能生效。还有一个小知识点.gitignore只能忽略未跟踪的文件。如果一个文件已经提交过后来你再把它加进 .gitignoreGit 依然会持续跟踪它的变化。简单说文件早就上了“名单”你怎么设置黑名单都没用。需要先把文件从 Git 索引里移除后面会讲具体操作。2.3 IDEA 项目必须忽略的三大类文件我整理了使用 IDEA 开发时最常见的三类需要忽略的文件你可以直接对照自己的项目第一类是IDEA 自身的配置。.idea/目录里有一堆 xml 文件但并不是所有都要忽略。像 workspace.xml 这种保存个人状态的一定要忽略而像 misc.xml、vcs.xml、modules.xml 这几种视情况而定。如果你希望团队成员打开项目时能有统一的代码风格和框架配置可以保留部分文件。但为了减少冲突更稳妥的做法是把整个.idea目录都忽略每个人用自己的本地配置团队统一代码风格交给 EditorConfig 来解决。还有*.iml文件这是 IDEA 的模块描述文件建议忽略。第二类是构建产物。Maven 项目是target/Gradle 项目是build/这些目录里的内容是从源码生成的完全可以重新构建不需要提交。忽略它们能避免提交记录里出现大量二进制变化也让仓库体积小很多。第三类是本地环境与敏感信息。.env、application-local.yml、*.p12、*.jks、secret.properties这类文件一定不能提交。有些团队会提交一个application.example.yml作为模板里面写上占位符大家复制成application-local.yml自己填配置这个思路很值得推荐。另外还要看项目语言和框架。如果是 Node 项目要忽略node_modules/Python 项目要忽略__pycache__/、*.pyc、.venv/Go 项目忽略编译出的二进制文件。这些内容在后面给的模板里会一并列出。3. IDEA 中配置忽略文件的实操步骤新旧项目都适用3.1 从零开始的新项目先把规则立好新建一个项目第一件事不是写代码而是把 .gitignore 建起来。IDEA 里操作很简单在项目根目录上右键 - New - File输入.gitignore确认。然后把适合自己项目的规则粘贴进去。如果你创建的本身就是 Spring Initializr 项目IDEA 会帮你生成一份基本的 .gitignore不过内容比较精简建议手动补充。新项目永远不会嫌规则多因为还没有任何文件被提交过这时候写规则是零成本的。3.2 已有项目的补救忽略“不该提交”的文件如果项目已经开发一段时间.gitignore 也加好了但发现有些文件已经悄悄进了仓库直接改 .gitignore 是没用的。你需要先“去跟踪”再忽略两步走第一步打开 IDEA 的 Terminal 窗口输入命令git rm -r --cached .这个命令会把当前项目所有文件从 Git 索引中移除但不会删除磁盘上的文件。注意--cached是关键如果不加它会连带把工作区的文件也删掉那就真删了很危险。第二步输入git add .这时候 Git 重新扫描所有文件遇到 .gitignore 里匹配的会自动跳过剩下的都是应该提交的内容。执行git status看一眼确认没有 ajax 生成目录、class 文件、IDE 配置文件就可以正常提交了。这里还要提醒一句git rm -r --cached .这条命令执行完之后你会发现 IDEA 里所有文件都变成了新增状态看起来像整个项目被重写了一遍。这是正常现象不用慌。提交记录里会显示大量 “delete add” 的变化对于代码评审者来说有点噪音但这是一次性的代价之后提交记录就干净了。3.3 IDEA 自带的“忽略”功能只能算补充方案在 IDEA 的 Settings - Editor - File Types 里可以添加忽略文件和目录这样文件就不会显示在项目视图里。还有一个路径是 Settings - Version Control - Ignored Files通过加号按钮可以添加忽略规则效果和写 .gitignore 类似。但我不建议把这里当作主力方案原因有三个第一这个设置是存在本地的不会跟随项目同步到其他协作者别人拉代码后看到的还是未忽略的状态第二它不能处理比较复杂的通配规则第三如果你换了电脑或换了 IDE配置就丢了。所以主力方案依然是仓库根目录的 .gitignoreIDEA 的设置可以作为临时屏蔽文件的小工具。3.4 一个可直接复用的 Java/IDEA 项目 .gitignore 模板下面这个模板我维护了很久Java 后端项目基本可以直接用# OS .DS_Store Thumbs.db # IntelliJ IDEA .idea/ *.iml *.ipr *.iws out/ # Maven target/ !.mvn/wrapper/maven-wrapper.jar # Gradle .gradle/ build/ !gradle/wrapper/gradle-wrapper.jar # Logs *.log logs/ # 敏感信息与本地配置 .env application-dev.yml application-local.yml *.p12 *.jks *.key secret*.properties # 测试与覆盖率报告 test-output/ *.log htmlReport/ jacoco.exec coverage/ # 临时文件 *.tmp *.temp *.bak *~这里有两个细节值得说一下。!.mvn/wrapper/maven-wrapper.jar和!gradle/wrapper/gradle-wrapper.jar是例外规则意思是 Maven/Gradle 的 wrapper 目录里的 jar 包需要保留因为这是项目构建环境的一部分不保留的话换机器可能会因为 Maven 版本问题构建失败。*~是 IDE 自动备份文件Windows 也可能出现~$开头的 Office 临时文件可以在后面加一行~$*。对于多模块项目target 目录会出现在每个模块下模板里的target/规则会自动匹配所有层级的 target 目录不需要为每个子模块单独写一行。4. 实操中的“为什么”那些容易忽略但很重要的细节4.1 我为什么推荐整个忽略 .idea 目录刚开始写 Java 的老手可能会反对说 .idea 里的 codeStyle 配置、inspection 配置也值得共享。我不否认这一点但我更看重的是稳定性和协作效率。workspace.xml 是一个典型的“必变文件”它记录的窗口布局、运行配置、断点信息基本每个人都不一样。只要有一个人提交了 .idea 目录其他人拉代码时就会频繁遇到文件冲突Git 合并时在 XML 文件上的冲突是出了名的难看。与其反复处理不如直接一刀切忽略整个 .idea代码风格统一交给 .editorconfig 和 checkstyle 插件完成。IDEA 的配置虽然个人不同但不影响编译和运行。不过我遇到过一个特例有些老项目用的是 Eclipse其中一个老同事坚持用 IDEA Import 项目生成的 .classpath 和 .project 文件被提交进仓库导致每次全组构建都会有人不小心把 Eclipse 的配置文件改坏。后来统一改成忽略.classpath、.project、.settings/才消停。这个案例告诉我忽略规则不是越全越好而是要真正理解自己项目的协作模式。4.2 为什么有时候 .gitignore 写了规则却不生效这个问题排在“Git 新手问题 Top 5”完全没问题。最常见的原因就是前面说的——文件已经被 Git 跟踪了。你后来才在 .gitignore 里加规则对已跟踪文件是无效的。排查方法很简单在 Terminal 里执行git check-ignore -v target/xxx.class如果有输出说明规则匹配成功会显示是哪一行规则命中的。如果没有输出说明规则没匹配上先去检查语法。还有一个小陷阱.gitignore文件名前面有个点很多 Windows 用户保存文件时系统会把它变成.gitignore.txtGit 完全不认规则自然不生效。在 IDEA 里新建 .gitignore 一般不会出现这种问题但如果你用记事本手工创建就要小心。4.3 git rm --cached 和 rm 的区别一条命令引发的“血案”git rm和git rm --cached的区别是前者会同时把文件从工作区和索引里删除后者只从索引里删除保留工作区文件。前面讲补救已提交文件时用的是后者。我再强调一次不要手滑敲成 git rm -r .。index 没了可以重建工作区文件没了你要么从 Git 历史里恢复前提是提交过要么就真的丢了。这种事故我在网上看过太多了每次都觉得痛心。如果你实在不确定先在分支上测试或者备份整个项目目录再操作。4.4 全局忽略一种“隐藏很深”的黑名单除了项目级 .gitignoreGit 还支持全局忽略文件。执行git config --global core.excludesfile ~/.gitignore_global然后在 ~/.gitignore_global 里写上规则比如.DS_Store、*.log这类所有项目都不想提交的内容。这个配置存在个人电脑上不会随项目分享。它的应用场景主要是个人习惯类的内容不适合团队级约束。还有一层是.git/info/exclude文件它存在于每个仓库的 .git 目录里只对当前仓库生效不需要提交。如果你有一个文件只想本项目忽略但不想写到 .gitignore比如你自己临时调试用的文件放到这里最合适。但要注意这个文件是“公开”的其他人 Clone 后没有这个文件所以不要指望它来规范团队协作。5. 常见问题与排查技巧实录附速查表5.1 我把太多文件提交上去了怎么让它们“退回去”分两种情况。如果你还没推送到远程直接git reset --soft HEAD~1或者更简单在 IDEA 的 Git Log 面板里右键上一个提交选择 Undo Commit就能保留已经暂存的文件状态。如果你已经推送到远程那就麻烦一点。可以在 IDEA 里用交互式 rebase 删掉那个提交然后 force push。但这里要很慎重force push 会改写远程历史如果仓库是多人共用的其他人拉代码会出大问题。正确做法是先和团队确认然后在临时分支上操作确认没问题后再强推最后通知所有人重新拉取。5.2 规则看似正确但匹配无效从优先级找问题看过一个项目.gitignore 里有*.properties却又写了!application.properties但 application.properties 还是被忽略了。原因在于这个文件在src/main/resources/下而上面某一行写了src/导致整个 src 目录被忽略下面的任何文件都无法通过取反恢复。Git 的这个限制很难绕解决办法就是不忽略 src 目录而是忽略具体子目录或文件。这提醒我们写规则时先从“最宽”的角度想一遍再去写取反规则。多数情况下能不取反就不取反。5.3 IDEA 里文件是灰色/黄色/绿色都是什么意思IDEA 的文件颜色本身就是版本的“晴雨表”。红色/黄色/绿色的详细定义是红色是未跟踪文件Untracked绿色是新增且已暂存蓝色是已修改但未暂存。如果你看到本来应该是源码的文件显示成灰色那说明它被 .gitignore 忽略了IDEA 用这种颜色提醒你“这个文件不会被提交”。灰色本身是正常的但你也要学会区分如果 target 目录下的 class 文件是灰色的OK如果 application.yml 是灰色的而你确实想让其他人也使用这个文件那就要去检查是不是规则写得太宽了。5.4 一个快速自查清单我把这些年遇到最多的问题整理成一个速查表按优先级排查基本能解决 90% 的问题问题现象大概率原因排查/解决方法忽略规则不生效文件已被 Git 跟踪执行 git rm --cached 后重新 add规则不生效且文件是新增.gitignore 文件名或编码问题确认文件是 .gitignore 而不是 .gitignore.txt编码用 UTF-8取反规则无效父目录被忽略调整规则先取反父目录或改为直接忽略更精确的路径不同协作者忽略行为不一致有人在 IDEA 本地设置忽略没提交 .gitignore统一改用项目级 .gitignore提交后 .idea 文件一直冲突workspace.xml 被跟踪git rm --cached .idea/workspace.xml 并加入 .gitignoretarget 目录偶尔出现在变更列表规则写成了 /target 但模块在子目录改成 **/target/ 或直接 target/敏感文件历史已经存在直接加 .gitignore 无效需要从历史中清除git filter-repo / BFG并更换密钥5.5 两个容易忽视的小技巧第一.gitignore支持在文件末尾添加说明注释。团队协作时建议在每条规则旁边写上为什么忽略比如“# IDE workspace禁止提交个人配置”。这个习惯能帮你减少大量解释成本。第二如果你使用了 Git 的 submodule 或者 monorepo子仓库里要单独维护 .gitignore。根目录的规则不会“穿透”到子模块里因为子模块本身是一个独立仓库两者的忽略机制是互相隔离的。6. 一些来自实操的个人经验最后再聊几点个人体会。我在实际开发中逐渐形成了一个习惯每个新项目无论多小都从 .gitignore 开始。规则本身不复杂但养成立规矩的习惯很重要。这跟写单元测试是一个道理——前期多花 10 分钟后面能省下大把改 bug 的时间。有一次项目组里一个新来的同事在提交代码时把本地的数据库密码文件推到了内部 GitLab。当时我们做了几个动作先把问题摁住了让他立刻修改数据库密码、从远程删除这个文件、再用 force push 清掉提交记录、最后全组统一核查一遍 .gitignore。这一套流程走下来大家都明白了忽略文件这件事绝不是可有可无的装饰。如果你现在手头的项目已经“脏”了也别慌按第 3 节的步骤处理一遍就好。我处理过最大的一个老项目仓库里有几万个文件其中一半都是不该跟踪的编译产物。跑完git rm -r --cached .和git add .之后仓库文件数量从 46000 降到了 9000。提交记录瞬间清爽后续的每次 merge 体验也完全不一样了。补充一个小技巧配置好 .gitignore 后再配合 IDEA 的 Commit 窗口提交前一定花 5 秒扫一眼文件列表。如果看到超出预期的文件宁可取消提交去排查也不要抱侥幸心理直接推上去。被忽略的文件就像家里的死角平时看不见等大扫除的时候才发现全是灰。早清理早安心。
返回列表