4

所以,我整个上午都在寻找正确的方法来做到这一点,而我只是不是那种精通命令行的人来解决这个问题。

我有一个 git repo,里面有很多资产。这就像大罪,我知道。

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

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

4

3 回答 3

3

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

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

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

您应该仔细按照使用说明进行操作,但核心部分是这样的:

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

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

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

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

于 2014-12-01T18:17:42.743 回答
1

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

git clone --depth=1 oldrepo newrepo

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

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

于 2014-12-01T16:47:44.600 回答
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
于 2014-12-01T17:39:10.077 回答