从早期的git历史记录中删除已提交并推送的大文件

时间:2020-03-23 12:27:32

标签: git git-filter-branch

我对使用git真的很陌生,并且犯了一个错误,即将我的(大)数据文件(在大.RData文件上)也推送到了gitlab上的在线存储库中。现在已达到我的最大大小限制,无法再进行任何推送。所以我想删除数据文件。我找到了git的filter-branch命令。但是问题是:在很早的提交中,文件被称为datafile_early.RData,然后在几次提交后,该文件被删除并被datafile_later.RData取代(我也在该存储库上与其他人一起工作)。

那我该如何从历史中清除datafile_early.RData?我试过了: git filter-branch -f --tree-filter 'rm datafile_early.RData',它开始从第一次提交中将其删除,但是由于后来的提交失败,它不再能找到该文件。

Rewrite a9c05c45dd0c2dacb7ba79cf829fb76a3fb70da3 (4/22) (22 seconds passed, remaining 99 predicted)  rm: datafile_early.RData: No such file or directory
tree filter failed: rm datafile_early.RData

我还有什么其他选择?

1 个答案:

答案 0 :(得分:1)

如果使用num| value (a) | value (b) ------------------------- 1 | 5 | 7 2 | 6 | 9

  • git filter-branch 非常慢;尽可能使用--tree-filter
  • 设置每个过滤器,使其不报告故障状态。

第二点是一个Lasse V. Karlsen mentioned in a comment:您可能希望树过滤器命令读取--index-filter来删除存在的这些文件中的任何一个,即使没有删除任何内容,也要成功。

要解决第一点,请注意,可以将由rm -f datafile_early.RData datafile_later.RData命令组成的树过滤器替换为由rm命令组成的索引过滤器。在这种情况下,合适的匹配命令为:

git rm --cached

整个git rm --cached --ignore-unmatch datafile_early.RData datafile_later.RData 命令因此可能是:

git filter-branch

(可选地,删除反斜杠-换行符序列以使其全部变成一行),其运行时间应比git filter-branch \ --index-filter \ 'git rm --cached --ignore-unmatch datafile_early.RData datafile_later.RData' \ --tag-name-filter cat -- --all 变体少得多。