从LFS启用的Git仓库迁移指定目录至另一LFS仓库遇故障求助
解决Git LFS环境下迁移指定目录至新仓库的Smudge Filter错误问题
我之前也踩过这个LFS迁移的坑——smudge filter失败本质是迁移过程中LFS指针和远程存储的对象没同步上,不管是本地克隆间操作还是用filter-branch推送到VSTS,都容易因为LFS的特殊存储机制出问题。下面给你一套亲测有效的操作流程,能避开这个麻烦:
先做准备工作,确保LFS环境正常
- 先确认本地装了Git LFS,并且每个仓库都启用了本地支持:
git lfs install --local - 分别克隆原仓库和目标仓库到本地,一定要拉全LFS对象:
# 克隆原仓库并拉取所有LFS文件到本地缓存 git clone <原仓库URL> cd 原仓库目录 git lfs pull # 克隆目标仓库 cd .. git clone <目标仓库URL>
用git filter-repo替代filter-branch(对LFS更友好)
git filter-branch 老早就被官方不推荐了,对LFS的支持尤其差。换成git filter-repo(可以用pip安装:pip install git-filter-repo)来处理目录迁移:
- 进入原仓库本地目录,执行命令只保留你要迁移的目录,还能顺便重命名路径:
举个例子:要把原仓库的git filter-repo --path <要迁移的目录> --path-rename <原目录>:<新仓库里的目标路径>assets/images迁移到新仓库的static/img,就写--path assets/images --path-rename assets/images:static/img - 检查一下处理后的仓库,确认LFS文件还在被正确追踪:
能看到列出的文件就是正常的。git lfs ls-files
推送到目标仓库,先同步LFS再推代码
这步很关键,别直接推代码,先把LFS对象传过去:
- 进入目标仓库本地目录,把处理好的原仓库设为远程:
cd 目标仓库目录 git remote add temp-origin ../原仓库处理后的目录 git fetch temp-origin - 把目标仓库的分支重置到迁移过来的历史(如果是新仓库直接重置就行,要是有原有内容可以考虑合并):
git reset --hard temp-origin/main # 替换main为你要迁移的分支名 - 先推送LFS对象到目标仓库的远程(比如VSTS):
git lfs push origin main - 最后推送代码分支:
git push origin main --force # 如果需要覆盖原有分支就加--force,新仓库可以不用
要是还出问题的排查技巧
- 清理本地LFS缓存再重新拉取:
git lfs clean git lfs pull - 检查目标仓库的
.gitattributes文件,确保里面的LFS追踪规则和原仓库完全一致,这个文件要是丢了或者错了,肯定会触发smudge错误
内容的提问来源于stack exchange,提问作者user9512480
相关产品推荐
相关产品推荐

