从历史记录中删除所有不在工作树中的文件

时间:2019-07-09 11:08:01

标签: git branch git-diff git-filter-branch git-rm

StackExchange上的许多答案都涉及从历史记录的所有提交中删除给定文件,例如:

git filter-branch --prune-empty -d /dev/shm/scratch \
 --index-filter "git rm --cached -f --ignore-unmatch filename" \
 --tag-name-filter cat -- --all

但是,随着时间的推移,我的存储库中有大量数据被推送到其中,我希望通过过滤掉不在当前工作树中的所有文件来显着减小其大小。

在手册页中,可以通过以下方式针对索引进行操作:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

从我可以收集的第一部分中,可以获取所有已删除文件的名称,第二部分将其从缓存版本中删除。

我不能完全解决的是如何更改rm命令的筛选器分支版本,以确保它将索引的该版本与头部进行比较(从而删除所有已删除的文件)。

此操作的目的是删除历史记录中当前工作树中不存在的所有文件。

1 个答案:

答案 0 :(得分:1)

  

这样做的目的是删除历史记录中当前工作树中不存在的所有文件。

尽管您使用的是git filter branch,但您可能要考虑使用BFG Repo Cleaner(一种更快,更简单的替代方法),其行为与开箱即用的行为非常相似。有细微差别:

  • 我认为您正在寻求删除不在当前HEAD提交中的任何文件的所有历史记录-即最新提交的完整文件树
  • 使用BFG,您可以删除按大小或名称指定的所有文件的所有版本(包括通配符),它将only preserve file versions that are in your latest commit

...因此,如果您使用:

$ bfg --delete-files "*.png"

...所有.png文件将从您的项目历史记录中删除-当前提交中任何.png文件的特定版本除外。请注意,如果某个文件的特定版本在您历史记录中的任何地方一次出现一次,那么它可能会出现一千次,就git而言,它仍然具有相同的存储要求。

  

随着时间的推移,我的存储库中有很多数据,我希望显着减小其大小

由于您的总体目标是减小尺寸,因此只要达到目标,您就很高兴!这样就可以运行:

$ bfg --strip-blobs-bigger-than 10K

...这将删除所有大于10 KB的文件(非当前文件),这将大大减少回购文件的大小,并且附带的好处是保留了没有问题的较小文件的历史记录。

完整披露:我是BFG Repo-Cleaner的作者。