GitLab重复列出同一项目组文件夹是何原因?
问题触发原因
- 核心原因是GitLab路由表脏数据/缓存异常:GitLab为了兼容分组重命名、子组跨层级迁移、跨组项目关联后的旧路径跳转,会在数据库
routes表里给同一个对象存多条路径映射。一旦重命名、迁移操作中途执行失败,或者后续缓存刷新逻辑没触发,同一个分组ID就会挂着两条有效路由,前端拉取列表的时候会把这两条路由当成两个独立分组渲染出来。本质上两个条目指向数据库里的同一个分组对象,所以改其中一个的名字,另一个会同步变更。 - 其次是权限聚合缓存异常:如果你的账号同时从两个不同的上层组继承了这个子组的访问权限,实例拉取个人有权限的分组列表时,权限聚合逻辑出现缓存脏数据,会把同一个分组按两个权限来源各渲染一次。
- 自托管GitLab实例如果刚完成版本升级、没有重建搜索索引,新旧索引里的同一条分组记录会被同时拉取,也会出现重复展示的问题。
处理方案
按操作优先级从易到难尝试:
- 先试无需管理员权限的操作:
- 退出账号重新登录,强制刷新浏览器缓存(Windows按
Ctrl+F5,Mac按Cmd+Shift+R),排除前端本地缓存导致的渲染错误。 - 进入任意一个重复分组的设置页面,修改一个无关配置(比如给分组描述加一个空格后保存),触发GitLab主动刷新该分组的路由缓存,等待1-2分钟后返回项目列表页查看是否恢复正常。
- 退出账号重新登录,强制刷新浏览器缓存(Windows按
- 上述操作无效时,联系GitLab实例管理员执行以下排查:
- 进入GitLab Rails控制台校验路由数据,执行以下命令:
如果命令输出两个不同的路径,即可确认是路由表冗余记录导致的问题,备份数据库后删除不属于该分组当前真实路径的冗余路由记录即可。# 进入生产环境Rails控制台 gitlab-rails console -e production # 将下面的数字替换为重复分组的实际ID target_group = Group.find(分组ID) # 打印该分组绑定的所有路径 puts target_group.routes.pluck(:path) - 如果校验后路由表仅存在一条对应记录,执行全局缓存清理命令:
gitlab-rake cache:clear RAILS_ENV=production。如果实例开启了Elasticsearch搜索,清理完成后执行gitlab-rake gitlab:elastic:rebuild_indexes重建搜索索引。
- 进入GitLab Rails控制台校验路由数据,执行以下命令:
- 如果你使用的是GitLab官方SaaS服务,无法执行管理员操作,直接向GitLab支持提交工单,附上重复分组的ID、异常页面截图,申请后台清理脏数据即可。

内容的提问来源于stack exchange,提问作者makazoid
相关产品推荐
相关产品推荐

