2

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 命令的过滤器分支版本,以确保它将索引的版本与头部进行比较(从而删除所有已删除的文件)。

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

4

1 回答 1

1

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

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

  • 我认为,您希望删除不在当前 HEAD 提交中的任何文件的所有历史记录 - 即您最新提交的完整文件树
  • 使用 BFG,您可以删除按大小或名称(包括通配符)指定的任何文件的所有版本,并且它只会保留最新提交中的文件版本

...所以如果你使用:

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

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

随着时间的推移,我的 repo 有大量数据推入其中,我希望能显着减小它的大小

由于您的总体目标是减小尺寸,所以只要您实现了这一目标,您就会很高兴!所以你可以运行:

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

...这将删除所有大于 10 KB 的(非当前)文件 - 它会大大减少 repo 大小 - 并且作为附带好处,可以保留没有问题的较小文件的历史记录。

全面披露:我是BFG Repo-Cleaner的作者。

于 2019-07-09T11:56:39.297 回答