ARTICLE DETAIL

资讯详情

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

GitKraken中修改.gitignore:忽略文件与解决跨平台差异指南

GitKraken中修改.gitignore:忽略文件与解决跨平台差异指南 先说个我最近踩的坑在GitKraken的Commit面板里明明已经把node_modules写进.gitignore了它却还是稳如泰山地躺在未跟踪文件列表里。后来才发现不是GitKraken出了问题而是我对.gitignore这套忽略机制的认知有个漏洞。这篇文章就把GitKraken中修改.gitignore、实现忽略文件和忽略文件夹的完整路径讲清楚包括PC与Unix跨平台场景下“用Beyond Compare比较内容完全一致Git却仍提示已修改”的解法。GitKraken算是我用过这么多图形化Git客户端里把文件状态展示得最直观的一个。但越是好用越容易让人忽略底层规则。很多人日常就点几下拉取、提交、推送真到写.gitignore的时候反而麻爪图形界面上找不到“编辑忽略规则”的入口只好切回命令行。其实GitKraken里改忽略规则有好几条路把这几条路摸透了就能顺手把仓库里那些不相干的文件收拾干净。这篇文章适合正在用GitKraken但还没搞懂忽略规则的人也适合已经会一点Git、但总在跨平台项目里被“文件内容一致却显示已修改”折磨的开发者。我会从原理说到操作再给出一套可以直接套用的实战流程最后把常见问题排一遍。1. 为什么要在GitKraken里折腾.gitignore先弄懂它在Git工作流里的角色1.1 .gitignore不是黑名单而是“新面孔名单”很多人的第一反应是.gitignore就是Git的黑名单写进去的文件Git就不管了。这个理解有偏差。更准确的说法是Git有一个“跟踪”Tracking的概念一个文件只要进入过版本库Git就会持续记录它的每一次变化。.gitignore影响的是那些“尚未被跟踪”的文件也就是仓库里新冒出来的、Git觉得你有可能要提交的东西。对于已经被跟踪的文件.gitignore完全不起作用哪怕你把它写进去Git照样会显示它被修改了。我经常用一个类比.gitignore像是小区门口的门卫名单它只拦“新面孔”拦不住已经住进去的业主。哪怕你把某个业主的名字写到“禁止进入”名单里他只要还住在这栋楼里照样每天进出。所以想用.gitignore把某个已经被跟踪的文件“隐形”正确的做法是先把它从跟踪列表里移除再写规则。这个顺序问题我后面会在实战部分专门演示。1.2 在GitKraken里改忽略规则到底图什么有人会说改.gitignore不是vi几行命令就完事了吗为什么非要图形界面我自己的体会是命令行适合“确定知道规则怎么写”的人图形界面的价值在于“反馈即时可见”。GitKraken的Commit面板里未跟踪文件、已修改文件、已暂存文件是分区域展示的你每保存一次.gitignore文件列表立刻会重新整理哪些消失了、哪些变灰了、哪些还在一目了然。这种即时反馈对初学者建立正确的心理模型特别有帮助。除此之外GitKraken里内置的编辑器可以直接编辑.gitignore文件不用再切到外部编辑器。文件保存后Git会自动感知变化相当于把“改规则”和“验证效果”两个动作合并到了一起。对于不想记命令、又想把仓库维护干净的人来说这个体验比命令行友好太多。1.3 哪些文件最该进忽略名单一份高频清单写.gitignore之前先要有目标。不同技术栈需要忽略的东西差别很大但有几类几乎是所有项目通用的构建产物node_modules、dist、build、target、out、.gradle这类由依赖安装或编译命令生成的内容。本地环境和密钥.env、.env.local、config/local.properties、*.pem这类文件通常包含机器相关的配置或敏感信息不该提交进公共仓库。IDE和操作系统噪音.idea、.vscode、Thumbs.db、.DS_Store、*.suo这些文件跟着你的开发工具走不同成员安装的插件版本还不一样提交进去只会制造冲突。日志和临时文件.log、.tmp、.cache、.nfs其中.nfs*是Linux下NFS挂载目录里偶发的临时文件在PC和Unix混合办公的场景特别常见。跨平台比较工具产物比如Beyond Compare这类目录比较工具生成的备份副本和报告文件具体规则我放到第3节一起讲。维护好这份忽略清单仓库会干净很多更重要的是能减少别人在Code Review里被无关文件干扰的次数。2. GitKraken中修改.gitignore的三种实操路径2.1 方法一在Commit面板里直接编辑.gitignore最直接的方式是编辑仓库根目录下的.gitignore文件本身。在GitKraken里打开任意一个仓库左侧通常会显示完整的文件列表.gitignore作为一个以点开头的隐藏文件在文件列表里是可见的双击它就能用GitKraken内置编辑器打开。修改后按保存Git会立刻感知到文件内容变化你回到Commit面板刷新一下就会发现匹配规则的未跟踪文件从列表里消失了。如果你的仓库还没有.gitignore文件可以新建一个。GitKraken支持在仓库内新建文件新建时输入文件名.gitignore即可也可以用任意文本编辑器创建后放回仓库目录。我个人倾向于让.gitignore常驻仓库根目录如果遇到某个子目录需要特殊规则再用“/”开头的路径或者嵌套.gitignore去解决而不是把规则写得满天飞。2.2 方法二右键文件让GitKraken帮你写规则GitKraken真正“图形化”这一块体现在这里在Commit面板的未跟踪文件上点右键能看到Ignoring相关的菜单项。选择之后会弹出一个小弹窗通常是让你确认要生成忽略规则或者询问是否把规则追加到现有的.gitignore中。确认后GitKraken会自动在仓库的.gitignore里写入一条规则文件的未跟踪状态也会随之消失。这个方法特别适合“仓库里莫名其妙冒出来一个文件我不想提交它”的场景。比如Windows上常见的Thumbs.db右键一下、点两下规则就自动进去了。不过要提醒一句自动生成的规则往往是最小匹配比如只匹配当前这个文件名为foo.log或者当前目录路径。如果你后面在别的目录又生成了同名文件这条规则可能覆盖不到。所以我通常把方法二当成“快速入口”规则生成之后还是回到方法一里手工精修一下该加通配符加通配符该加路径限制加路径限制。2.3 方法三从模板起步少踩语法坑GitKraken本身没有内置.gitignore模板库但生态里有现成的模板来源GitHub官方的gitignore仓库按技术栈分类gitignore.io可以按“NodeWindowsmacOSJetBrains”这样的组合快速生成一份。你可以生成后看一下里面的规则理解每一项为什么存在然后复制进GitKraken内置编辑器。用模板的好处是不需要自己从零想语法。很多新手会漏掉“.idea/”、“*.log”这类“看似不用管、实际天天制造噪音”的条目模板基本都覆盖全了。我自己刚换成GitKraken那阵子就养成了一个习惯新仓库建好后第一件事是把对应技术栈的模板丢进.gitignore再根据项目特殊情况删几行、加几行。2.4 三种方法怎么选一张对比表场景推荐方法优点注意点仓库还没有.gitignore方法三方法一组合模板全面批量解决模板可能包含无关规则需手工精简单文件/单个文件夹要忽略方法二最快不动脑子生成的规则偏具体需要后续精修已有.gitignore要精细调整方法一可控性最高需要大概掌握语法规则批量清理历史遗留文件方法一命令行git rm能从根上取消跟踪一定先备份再操作3. .gitignore语法速查从入门到够用3.1 六条基础规则覆盖日常90%的需求无论用哪个图形工具最终落到.gitignore文件里的还是那套语法。我按使用频率从高到低说几条精确文件名写config.json那就只忽略根目录下名为config.json的文件。想忽略任意层级的同名文件用**/config.json。目录忽略以斜杠结尾表示目录如node_modules/会忽略根目录的node_modules文件夹及其内所有内容。写成node_modules/和node_modules在GitKraken里的实际表现有细微差别建议养成带斜杠的习惯语义更清晰。星号通配符单星号匹配任意字符串但不含路径分隔符*.log能匹配a.logb/c.log需要写成**/*.log。双星号可以跨目录递归匹配。问号单字符temp?.txt匹配temp1.txt、temp2.txt不匹配temp10.txt。取反规则行首的!表示重新纳入。*.log和!important.log的意思是忽略所有日志但保留important.log。注释和转义#开头是注释文件名里真的包含#或!时需要用反斜杠转义比如\#note.md。有一条容易绕晕的规则是取反。如果dist/整个目录都被忽略了你写!dist/config.js是救不回来的因为Git不会深入到已忽略的目录里寻找可以放行的文件。想实现“只保留dist里的config.js”正确写法是把目录的忽略粒度改细例如先忽略dist/*再写!dist/config.js。3.2 PC与Unix跨平台内容一致却显示已修改该怎么办这是很多人问得最多、也最容易误解的问题。在PCWindows和Unix/Linux之间用Beyond Compare这类工具比较文件内容明明一模一样但拷到另一边后在GitKraken里却显示文件被修改了。注意这个问题绝大多数时候不是.gitignore能单独解决的因为它不是“文件是否需要被忽略”的问题而是“Git为什么错误地认为文件变了”的问题。Git判断文件是否修改依据的是工作区文件与版本库里的“期望内容”是否一致而换行符、文件权限、文件尾换行都会被Git纳入判断。Windows默认换行符是CRLFUnix/Linux是LF如果你用Windows把一份文件提交进仓库Git默认可能把CRLF原样存进去等你到了Unix/Linux这边再克隆出来Git一比对就认为内容变了——尽管你用Beyond Compare看两边内容长得一样。同理Unix上给脚本加了可执行权限chmod xWindows上没有这个概念Git也可能误判为文件修改。正确的处理思路是双管齐下。第一在仓库里放一份.gitattributes告诉Git统一的换行策略例如* textauto让Git自动处理换行转换.sh text eollf强制脚本文件始终用LF.bat text eolcrlf强制批处理用CRLF同时搭配core.autocrlf的合理配置。第二对于纯粹是平台噪音、生成物、比较工具备份一类的文件才轮到.gitignore上场。所以我在实战那节给出的是整套组合拳而不是让你天真地在.gitignore里写一条规则去按掉已经跟踪过的文件。3.3 Beyond Compare等比较工具产生的垃圾文件怎么忽略再具体到“bcompare”这个关键词。Beyond Compare在跨平台同步目录时可能会在工作目录里产出一些东西比较后生成的备份副本常见后缀.bak、.orig、.BCBackup文件夹或保存比较报告后留下的HTML/CSV文件。如果这些内容是给本次同步用的、不需要进版本库就要靠.gitignore拦住。我一般会在项目.gitignore里加这样几条# Beyond Compare 比较工具产物 *.bak *.orig BCBackup*/ BCBak*/规则写好后下一个动作是检查这些文件是不是已经被跟踪了。如果在加规则之前它们已经被提交过规则不会立刻生效必须先取消跟踪。这一步在GitKraken里没有专门的按钮需要Git命令行补一刀具体我下面会演示。4. 实操全程在GitKraken里把干扰文件和跨平台差异一起解决4.1 场景还原一份真实的跨平台仓库假设你接手了一个老仓库同事在Windows上用Beyond Compare对比过两个目录目录里留下了BCBackup副本仓库里还有一个config/database.tmp是每次启动自动生成的另一边程序在Linux上长期跑又冒出来一堆.nfs4文件。你在GitKraken里看未跟踪文件一大串再看已修改区有几个脚本文件明明内容没动过却显示已修改。此时你写下三条.gitignore规则保存后大部分未跟踪文件消失了但已修改那几个依然纹丝不动。这个场景几乎脱胎于真实协作未跟踪文件用.gitignore就能拦已修改文件是跟踪状态问题脚本显示已修改是换行符/权限问题。三件事病因完全不同不能指望一条规则治百病。下面我把整套处理流程拆成步骤。4.2 完整处理六步从GitKraken到命令行的组合操作第一步在GitKraken里盘点状态。打开Commit面板先看哪些文件在未跟踪区、哪些在已修改区、哪些已经被暂存。先区分哪些是“新冒出来的垃圾”哪些是“已经进过仓库的存量问题”。这一步别省很多越搞越乱的情况都是因为没区分存量和新量。第二步整理忽略清单。把目标分成三类比较工具产物.bak、.orig、BCBackup、自动生成文件database.tmp、.log、平台专有文件Windows的Thumbs.db、macOS的.DS_Store、Linux的.nfs。每类对应一组规则写进仓库根目录的.gitignore。# OS 平台噪音 Thumbs.db .DS_Store .nfs* # 自动生成与临时文件 *.log *.tmp *.cache config/database.tmp # Beyond Compare 工具产物 *.bak *.orig BCBackup*/第三步检查是否有“已被跟踪的存量”。如果目标文件已经出现在版本库里光写规则没用。打开GitKraken的已修改区如果看到某个被忽略目标依然在列表里说明它已经被跟踪。此时你必须先取消跟踪同时保留本地文件在仓库目录打开命令行执行git rm -r --cached 目标路径。这条命令的意思是“从Git索引中移除但保留工作区文件”。注意不要用git rm会连本地文件一起删也不要在GitKraken里点Discard那会丢弃本地改动甚至把文件从工作区删掉会出大事。有读者会问为什么图形界面不做这个按钮。我的猜测是取消跟踪这个动作语义上有歧义——到底要不要保留本地文件如果保留工作区里还躺着这个文件但它从此被排除在版本控制之外如果不保留就直接删文件。GitKraken更想让你用显式的方式表达而不是给个模糊按钮。理解了这点你就不会再去找那个“根本不存在的按钮”了。第四步处理跨平台“显示已修改”的问题。对已被跟踪但内容没变的文件在仓库根目录放一份.gitattributes* textauto *.sh text eollf *.bat text eolcrlf *.txt text然后按文件实际需要设置对应的行尾。还要检查Git的全局配置在命令行分别执行git config core.autocrlf、git config core.filemode。Windows上一般设core.autocrlf trueUnix/Linux上一般设input管理纯Unix/Linux项目时可以把core.filemode设为false避免权限位差异造成误报。这些配置改动后最好重新克隆一次仓库或者至少执行git add --renormalize .让Git按新规则重新规范化所有文件的换行再提交一次。第五步刷新GitKraken并提交。回到GitKraken先点一下刷新按钮或者切换一个分支再切回来让界面强制刷新。确认未跟踪区干净了已修改区里只剩下真正需要提交的改动然后正常Commit、Push。这次提交里应该包含更新后的.gitignore、新加的.gitattributes以及被取消跟踪的存量文件对应的删除记录对Git来说取消跟踪本身就是一次变更。第六步验证并形成习惯。后面每次在Windows和Unix之间同步数据、或者用Beyond Compare比完目录回来都用GitKraken的Commit面板扫一眼确认没有垃圾文件混进来。时间一长仓库会保持在一种“只显示真实变更”的状态Code Review也会清爽很多。4.3 验证忽略是否生效界面和命令行双确认验证这件事别只靠眼睛GitKraken的界面刷新可能有延迟更靠谱的是命令行里直接问Git。我常用的验证命令有两个git check-ignore -v 你的文件路径能显示这个文件是被哪一行规则忽略的。如果没有任何输出说明规则没匹配上。git status --ignored能看到所有被忽略的东西包括被忽略但不显示在列表里的内容。运行这个命令时输出可能比较长可以加--short或指定目录缩小范围。表格里整理一下判断逻辑现象可能原因下一步操作文件还在未跟踪列表.gitignore规则未匹配用git check-ignore -v确认规则在已修改列表但内容没变换行符/权限引起误报检查autocrlf与.gitattributes.gitignore里写了但没生效文件已被跟踪用git rm --cached取消跟踪push后别的平台又出现规则没有入库或只改在本地确保.gitignore变更已提交推送5. 常见问题与排查技巧实录5.1 加了规则还是不生效四个高频原因第一个高频原因规则本身没写对。比如你写的是node_modules但实际路径在packages/app/node_modules下面两者不匹配。第二个高频原因要忽略的文件已经被跟踪规则对存量无效。判断方法很简单打开GitKraken的文件列表只要某个文件出现在“已修改”而不是“未跟踪”区域它就一定已经被跟踪了。第三个高频原因规则语法里的层级缩进或斜杠方向问题在PC上尤其要小心反斜杠和正斜杠的混用。第四个高频原因你把.gitignore放错了目录。Git的规则是就近生效的如果你在子目录里放了一份.gitignore它的规则只对那个子目录及其子目录生效。5.2 GitKraken里找不到.gitignore文件怎么办GitKraken默认会显示仓库内的隐藏文件一般情况下你直接在左侧文件列表往下翻就能看到。如果看不到多半是文件视图处于某种过滤状态比如只看已修改文件、只看未跟踪文件这时切到“全部文件”视图即可。还有一种情况是仓库压根没有.gitignore你需要自己新建。在GitKraken中新建文件后输入文件名.gitignore特别要注意Windows上的编辑器或资源管理器可能自动把扩展名隐藏把文件变成.gitignore.txt那样的文件在GitKraken里会显示成一个名叫.gitignore.txt的普通文件但Git并不认识它。新建完最好看一眼文件名确保后缀没有被系统悄悄加上。5.3 取反规则失效为什么!important.log失灵了前面提过取反规则的坑如果父目录整体被忽略取反救不回来。我再说一个更隐蔽的情况.gitignore里后写的规则优先级更高如果你先写了*.log又写了!important.log按理说important.log应该被放行。但如果仓库里同时存在一份更深层级的.gitignore它就可能会覆盖根目录的放行规则。排查时可以用git check-ignore -v看具体是哪一行规则在拦截比肉眼找靠谱得多。5.4 改完.gitignore后GitKraken界面不更新这种情况我遇到过不止一次。通常不是规则没生效而是GitKraken的视图缓存没刷新。最简单的办法是点右上角刷新按钮如果还不行切换一下分支再切回来基本都能强制重绘。还有一种情况是你在外部编辑器里改了.gitignoreGitKraken可能不会自动感知这时候切一下窗口焦点通常能触发文件监听。实在不行重启一下GitKraken。记住一个原则界面可能会骗你但git status不会。最后再分享一点我自己的经验处理跨平台项目时别把.gitignore当成万能药。真正好的仓库状态是.gitignore、.gitattributes和本地的换行/权限配置三者配合出来的结果。写规则之前先想清楚“这个文件为什么不该提交”再动手总比反复试错来得快。GitKraken擅长把状态摊开给你看但最终怎么决策还是要对Git本身的机制有数。把这套组合拳练熟了无论是Windows、macOS还是Linux仓库都能保持干净一致。
返回列表