从 git 历史记录中删除未使用的资产



所以,我整个早上都在寻找正确的方法来做到这一点,我只是不懂命令行来弄清楚。

我有一个包含大量资产的 git 存储库。这就像大罪,我知道。

回购已经变得太大了。我想清理它,以便我可以以编程方式从存储库的整个历史记录中删除 HEAD 中不再存在的所有文件。我已经看到了可以指定文件路径的方法,但实际上,我说的是已从我们的最终产品中删除的 1000+ 个文件,我真的不再关心我的存储库中了。

更新:我已经清理了所有本来不应该存在的资产的回购。我现在真的只有源代码和一些应该在那里的资产。我真的很想保留所有源代码的所有历史记录......所以我真的希望从历史记录中删除已删除的文件,同时保留当前存在的历史记录。这就是目标。我很确定可以使用git filter-branch来完成 - 但我只是不太了解它。

使用 BFG Repo-Cleaner,这是一种更简单、更快速的替代方案,可替代专门为从 Git 历史记录中删除不需要的文件而设计git-filter-branch

所以我可以用编程方式从存储库的整个历史记录中删除 HEAD 中不再存在的所有文件

默认情况下,BFG 会"保护"HEAD 提交中的所有文件,但会删除符合您条件的其他文件。

您应该仔细遵循使用说明,但核心部分只是:

$ java -jar bfg.jar  --strip-blobs-bigger-than 1M  my-repo.git

任何大小超过 1MB 的文件(不在最新提交中(都将从 Git 存储库的历史记录中删除。如果您有要删除的普通小于 1MB 的源文件,则可以使用 --delete-files--delete-folders 选项指定它们。

BFG通常比运行git-filter-branch快至少10-50倍,并且通常更容易使用。

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

您可以制作存储库的浅层克隆,并将其作为新的"主"存储库,将旧的粗糙存储库保存在其他地方。

git clone --depth=1 oldrepo newrepo

这样,在新克隆中不再访问已删除的任何文件,因此它们不会存储为 Git 对象。

当然,缺点是这会隐藏文件更改历史记录,但它仍然可以在原始存储库中访问。

先备份您的数据,这几乎没有经过测试!

git filter-branch --tree-filter 'for i in $(git diff master --summary --diff-filter=A | grep "create mode" | cut -d " " -f 5-); do 
    rm "$i"
done' --prune-empty HEAD

最新更新