如何删除Git远程服务器的特定提交?GitLab强推后提交仍可访问怎么办
Git强制推送后仍可访问旧提交的问题解答
成因
你执行git reset --hard <last-good-commit-hash> + git push -f master的操作,仅修改了远程master分支的指针指向,未触发GitLab对旧提交的清理逻辑:
- 没有被任何分支、标签引用的提交属于悬空提交,原生Git默认会保留悬空对象至少2周才会通过垃圾回收(git gc)清理,Git托管服务为了支持操作回滚、合并请求追溯等功能,会大幅延长该保留周期
- GitLab内部有
refs/keep-around这类隐藏引用,会主动关联所有曾经被分支、合并请求引用过的提交,避免被常规gc操作误删,这也是你可以直接通过哈希访问、指定哈希拉取的核心原因 - 本地执行fetch报
not our ref是Git的安全限制:本地仓库的引用树中没有和该提交相关的链路,服务端默认不会返回未被本地已知引用关联的悬空对象,只有你显式指定远程地址+提交哈希拉取时才会返回。
是否为GitLab特有问题
不是。GitHub、Gitee等主流Git托管服务都有类似的悬空提交保留逻辑,原生Git本身也存在悬空提交延迟清理的机制,只是托管服务额外增加了隐藏引用保护、延长了保留周期,该现象属于Git托管服务的通用设计,并非GitLab独有。
彻底删除远程提交的操作步骤
注意:操作前请确认所有需要保留的分支、标签、合并请求都没有关联该坏提交,删除后无法恢复
- 如果你持有项目管理员权限:
- 进入GitLab项目后台,依次点击「设置」-「仓库」-「仓库清理」
- 在「清理对象」输入框中填入坏提交的完整哈希,点击「清理」即可触发服务端的强制清理逻辑
- 如果你是GitLab实例管理员,可通过服务器端操作直接清理:
- 登录GitLab服务器,进入对应项目的裸仓库存储目录
- 删除
refs/keep-around/路径下对应坏提交哈希的引用文件 - 执行强制垃圾回收命令:
git gc --prune=now --aggressive - 清理GitLab页面缓存,避免旧提交页面仍能通过缓存访问
- 清理完成后验证:访问坏提交的GitLab链接确认返回404,执行
git fetch --depth=1 <远程仓库地址> <bad-commit-hash>确认返回找不到对应引用的报错即可。
内容的提问来源于stack exchange,提问作者sconstable
相关产品推荐
相关产品推荐

