我对使用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 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
变体的运行时间要短得多。