使用git filter-repo后提交丢失,求原因及项目恢复方法
问题原因解释
你用的git filter-repo --force --path <文件路径>命令,默认逻辑是只保留指定路径相关的所有提交,而非删除该路径的内容。因为你要删的视频文件在后续提交里已经不存在了,所以这些后续提交会被过滤掉,最终仓库就只剩下包含这个视频文件的那些旧提交,看起来像是回到了以前的状态。另外你原命令里的路径多了个空格(res/ raw/),这也会导致命令匹配逻辑出现偏差。
项目恢复方法
方法1:利用filter-repo自动备份
git filter-repo执行时会自动把原分支引用备份到refs/original/目录下,直接执行以下命令就能恢复到操作前的状态:
git reset --hard refs/original/refs/heads/<你的分支名>
如果是默认主分支(比如main或master),命令可以简化为:
git reset --hard refs/original/refs/heads/main
方法2:通过reflog恢复
如果备份被意外清理,用git引用日志找回操作前的提交:
- 查看reflog记录,找到执行filter-repo之前的提交哈希:
git reflog
- 重置到该提交:
git reset --hard <找到的提交哈希>
正确删除大文件历史的命令
要彻底移除这个视频文件的所有历史,需要添加--invert-paths参数反转筛选逻辑(即排除指定路径),同时修正路径的空格问题:
git filter-repo --force --invert-paths --path myapp/app/src/main/res/raw/intro.mp4
内容的提问来源于stack exchange,提问作者Kowal
相关产品推荐
相关产品推荐

