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命令的筛选器分支版本,以确保它将索引的该版本与头部进行比较(从而删除所有已删除的文件)。
此操作的目的是删除历史记录中当前工作树中不存在的所有文件。
答案 0 :(得分:1)
这样做的目的是删除历史记录中当前工作树中不存在的所有文件。
尽管您使用的是git filter branch
,但您可能要考虑使用BFG Repo Cleaner(一种更快,更简单的替代方法),其行为与开箱即用的行为非常相似。有细微差别:
...因此,如果您使用:
$ bfg --delete-files "*.png"
...所有.png
文件将从您的项目历史记录中删除-当前提交中任何.png
文件的特定版本除外。请注意,如果某个文件的特定版本在您历史记录中的任何地方一次出现一次,那么它可能会出现一千次,就git而言,它仍然具有相同的存储要求。
随着时间的推移,我的存储库中有很多数据,我希望显着减小其大小
由于您的总体目标是减小尺寸,因此只要达到目标,您就很高兴!这样就可以运行:
$ bfg --strip-blobs-bigger-than 10K
...这将删除所有大于10 KB的文件(非当前文件),这将大大减少回购文件的大小,并且附带的好处是保留了没有问题的较小文件的历史记录。
完整披露:我是BFG Repo-Cleaner的作者。