所以,我整个早上都在寻找正确的方法来做到这一点,我只是不懂命令行来弄清楚。
我有一个包含大量资产的 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