Kustomize部署后ArgoCD同步报Git分支引用锁冲突错误
问题根因
该报错由Git引用规则冲突导致:Git不允许refs/remotes/origin/路径下同时存在同名的文件和目录。旧分支perf/from-master-nov-24在本地Git缓存中会生成refs/remotes/origin/perf/目录存储对应引用记录,当远程仓库新建顶层perf分支时,Git需要在同路径下创建名为perf的引用文件,和已存在的perf/目录冲突,就会触发ref锁定失败的错误。
本地执行git remote prune origin无效果的原因很简单:冲突的脏缓存不在你的本地工作环境,而是存储在ArgoCD Repo Server组件的内部Git缓存目录中,本地操作无法触及这部分缓存数据。
修复步骤
方案1:清理ArgoCD侧Git缓存(无副作用,优先选择)
- 先获取ArgoCD Repo Server的Pod列表:
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-repo-server - 两种清理方式二选一即可:
- 快速方式:直接滚动重启所有Repo Server Pod,重启后ArgoCD会自动重建所有仓库的本地缓存,不会携带旧的残留引用:
kubectl rollout restart deployment/argocd-repo-server -n argocd
等所有Pod进入就绪状态后,回到ArgoCD控制台触发应用同步即可。 - 定向清理方式:如果不想全量重建缓存,可进入对应Repo Server容器,找到对应Azure DevOps仓库的缓存目录(默认存放在
/tmp/_argocd-repo/下,可通过目录内的git remote配置匹配仓库地址),直接删除残留的冲突引用目录:rm -rf <仓库缓存路径>/.git/refs/remotes/origin/perf/
清理完成后在该缓存目录下执行git fetch origin --tags --force验证,无报错即修复完成。
- 快速方式:直接滚动重启所有Repo Server Pod,重启后ArgoCD会自动重建所有仓库的本地缓存,不会携带旧的残留引用:
方案2:持久化缓存场景的修复
如果你的ArgoCD为Repo Server配置了持久化存储卷,普通重启不会清空缓存数据,除了进容器手动删引用之外,还可以给Repo Server添加启动参数自动处理prune:
- 编辑
argocd-repo-server的Deployment配置,在启动参数段添加--repo-git-prune=true,保存后Pod会自动重建 - 等同步恢复正常后,可移除该参数,避免每次拉取都执行全量prune带来不必要的性能开销
注意事项
不需要调整Azure DevOps远程仓库的配置,也不需要在本地开发环境反复执行prune操作——远程仓库删除旧分支、新建perf分支的状态是正常的,问题完全出在ArgoCD侧的本地缓存脏数据。
内容的提问来源于stack exchange,提问作者Ed Whittle
相关产品推荐
相关产品推荐

