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

问题描述 投票:-1回答:1

我对使用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

我还有哪些其他选择?

git git-filter-branch
1个回答
0
投票

如果使用git filter-branch

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

[第二点是一个Lasse V. Karlsen mentioned in a comment:您可能希望树过滤器命令读取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

((可选地,删除反斜杠-换行符序列以使所有这行成为一行),比--tree-filter变体的运行时间要短得多。

© www.soinside.com 2019 - 2024. All rights reserved.