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

时间:2014-12-01 16:44:39

标签: git git-filter-branch git-rewrite-history

所以,我整个上午一直在寻找正确的方法来做到这一点,而且我并不是那个精明的命令行来解决这个问题。

我有一个git repo,里面有大量资产。我知道,这就像主要的罪恶。

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

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

3 个答案:

答案 0 :(得分:2)

使用BFG Repo-Cleaner,这是git-filter-branch的一种更简单,更快捷的替代方案,专门用于从Git历史记录中删除不需要的文件。

  

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

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

你应该仔细遵循usage instructions,但核心部分就是这样:

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

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

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

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

答案 1 :(得分:1)

您可以对存储库进行浅层克隆,并将其作为新的“主”存储库,并将旧的狡猾的存储库保存在其他位置。

git clone --depth=1 oldrepo newrepo

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

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

答案 2 :(得分:0)

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

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