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

从git历史记录中删除未使用的资产,git,git-filter-branch,git-rewrite-history,Git,Git Filter Branch,Git Rewrite History,所以,我整个上午都在寻找正确的方法来实现这一点,我只是没有那么精通命令行 我有一份git回购协议,里面有大量资产。我知道,这就像是大罪 回购协议已经变得过于庞大。我想清理它,这样我就可以通过编程从repo的整个历史中删除HEAD中不再存在的所有文件。我已经看到了这样做的方法,您可以指定文件路径,但实际上,我说的是从我们的最终产品中删除的1000多个文件,我真的不想再在我的repo中保留这些文件了 更新: 我已经清理了所有本来不该存在的资产。我现在真的只有源代码和一些应该存在的资产。我真的很想保留

所以,我整个上午都在寻找正确的方法来实现这一点,我只是没有那么精通命令行

我有一份git回购协议,里面有大量资产。我知道,这就像是大罪

回购协议已经变得过于庞大。我想清理它,这样我就可以通过编程从repo的整个历史中删除HEAD中不再存在的所有文件。我已经看到了这样做的方法,您可以指定文件路径,但实际上,我说的是从我们的最终产品中删除的1000多个文件,我真的不想再在我的repo中保留这些文件了

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

您可以对存储库进行浅层克隆,并将其作为新的“主”存储库,将旧的粗糙存储库保存在其他地方

git clone--depth=1 oldrepo newrepo

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


当然,它的缺点是隐藏了文件更改历史,但在原始repo中仍然可以访问它。

首先备份数据,这几乎没有经过测试

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
使用,这是git筛选器分支的一个更简单、更快的替代方法,专为从git历史记录中删除不需要的文件而设计

因此,我可以通过编程从repo的整个历史中删除HEAD中不再存在的所有文件

默认情况下,BFG“保护”您头部提交中的所有文件,但将删除符合您条件的其他文件

您应该仔细遵循以下步骤,但核心部分是:

$ java -jar bfg.jar  --strip-blobs-bigger-than 1M  my-repo.git
任何大小超过1MB的文件(不在最新提交中)都将从Git存储库的历史记录中删除。如果有小于1MB的正常源文件仍要删除,可以使用
--delete files
--delete folders
选项指定它们

BFG通常至少比运行git过滤器分支快,并且通常更易于使用


完全披露:我是BFG回购清理器的作者。

可能重复请参阅更新。我不这么认为。在这一点上,你有一个花园品种的过滤器分支问题。类似于
git filter branch--index filter“git rm-rf--cached--ignore unmatch$files”的HEAD
以及filter branch文档中的其他清理步骤应该适合您。问题是我不完全理解如何用我需要的内容填充$files变量。命令行语法不够流利。我在互联网上找到的很多东西都允许你删除特定的文件,但是没有什么好东西告诉你如何删除旧文件和保护头部的文件。老实说,我整天都在尝试使用你的程序,因为它听起来很完美。我没有意识到它默认保护头部文件。这很有效。我甚至不知道今天早些时候我的问题是什么,我无法让它工作。非常感谢!此外,您似乎需要运行:$git reflog expire--expire=now--all$git gc--prune=now--aggressive