2014-12-01 124 views
2

因此,我一直在寻找正确的方法来做到这一点,而我只是没有明确的命令行知识。从git历史记录中删除未使用的资产

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

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

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

+0

可能重复https://stackoverflow.com/questions/61212/remove-local-untracked-files-from-my-current-git-branch – DRC 2014-12-01 16:47:28

+0

查看更新。我不这么认为。 – normmcgarry 2014-12-01 17:05:21

+0

此时您有一个花园品种过滤分支问题。就像'git filter-branch --index-filter'git rm -rf --cached --ignore-unmatch $ files“HEAD”加上过滤器分支文档中的其他清理步骤应该适合您。 – 2014-12-01 17:55:03

回答

2

使用BFG Repo-Cleaner,更简单,更快速的替代git-filter-branch专门针对Git的历史记录中删除不需要的文件而设计的。

,所以我可以编程方式删除不HEAD从回购

默认情况下的整个历史存在了所有文件,BFG的“保护”在你的脑袋中的所有文件提交,但会删除符合条件的其他文件。

您应仔细按照usage instructions,但最核心的部分就是这个:

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

超过1MB大小的任何文件 - 不在您的最新提交 - 将从您的Git中移除资料库的历史。如果您有一个正常的,小于1MB的源文件,您仍然想要删除,则可以使用--delete-files--delete-folders选项指定它们。

该BFG通常至少比运行git-filter-branch10-50x,并且通常更易于使用。

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

+2

老实说,我一直试图整天使用你的程序,因为它听起来很完美。我没有意识到它默认保护HEAD文件。这工作完美。甚至不知道我今天早些时候的问题,我无法得到这个工作。非常感谢!此外,它似乎你需要运行: $ git reflog expire --expire = now --all $ git gc --prune = now --aggressive – normmcgarry 2014-12-01 19:37:54

0

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

git clone --depth=1 oldrepo newrepo

这样被删除的所有文件不再在新的克隆可达,所以他们不会被存储为Git对象。

不利的一面是,这隐藏了文件更改历史记录,但它仍然可以在您的原始回购库中访问。

+0

查看更新...我宁可不采取这种方法。 – normmcgarry 2014-12-01 17:06:46

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 
相关问题