GIT:如何从历史提交中删除文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

我已经提交了id 56f06019(例如)。在那次提交中,我意外地完成了大文件(50 Mb)。在另一个提交中,我添加了相同的文件,但大小是正确的(很小)。现在我克隆时的回购太重了:(如何从回购历史记录中删除那个大文件以减少回购的大小?)

提问于
用户回答回答于

以下步骤:

git filter-branch --index-filter \
    'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
    --tag-name-filter cat -- --all

filter-branch重写操作。如果你发表了历史,你必须--force推新裁判。

filter-branch方法比rebase方法,因为它

  • 允许同时处理所有分支/参考文献,
  • 动态重命名任何标记
  • 操作干净,即使自文件添加以来已经有几次合并提交。
  • 即使文件在(A)分支(Es)的历史记录中添加/删除了几次,操作也是干净的。
  • 不会创建新的、无关的提交,而是在修改与它们关联的树时复制它们。这意味着,像签名提交、提交注释等内容将被保留。

filter-branch也保留备份,因此,除非REFLOG和垃圾收集过期,否则回购的大小不会立即减少:

rm -Rf .git/refs/original       # careful
git gc --aggressive --prune=now # danger
用户回答回答于

如果提交位于头-10,提交:

$ git rebase -i HEAD~10

在历史记录版本之后,需要推送“新”历史记录,需要添加+强制:

$ git push origin +master

如果其他人已经克隆了存储库,将通知他们,因为刚刚更改了历史记录。

扫码关注云+社区