从git历史记录中删除未使用的资产
因此,我一直在寻找正确的方法来做到这一点,而我只是没有明确的命令行知识。从git历史记录中删除未使用的资产
我有一个git repo,里面有很多资产。这就像我知道的主要罪。
回购已经变得太大了。我想清理它,这样我可以以编程方式从整个回购历史记录中删除HEAD中不存在的所有文件。我已经看到了可以指定文件路径的方法,但实际上,我正在说1000个以上的文件,这些文件已从我们的最终产品中删除,而我真的不想再购买我的repo文件。
更新: 我清理了本来不应该在那里的所有资产的回购。我现在真的只有源代码以及一些应该在那里的资产。我真的很喜欢保留所有源代码的所有历史记录......所以我真的想要从历史中删除已删除的文件,同时保留当前存在的历史记录。这是目标。我很确定它可以使用git filter-branch
来完成 - 但我对此不够了解。
使用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-branch
快10-50x,并且通常更易于使用。
完全披露:我是BFG Repo-Cleaner的作者。
老实说,我一直试图整天使用你的程序,因为它听起来很完美。我没有意识到它默认保护HEAD文件。这工作完美。甚至不知道我今天早些时候的问题,我无法得到这个工作。非常感谢!此外,它似乎你需要运行: $ git reflog expire --expire = now --all $ git gc --prune = now --aggressive – normmcgarry 2014-12-01 19:37:54
您可以对存储库进行浅层克隆,并将其作为新的“主”存储库,并将旧的存储库保存到其他位置。
git clone --depth=1 oldrepo newrepo
这样被删除的所有文件不再在新的克隆可达,所以他们不会被存储为Git对象。
不利的一面是,这隐藏了文件更改历史记录,但它仍然可以在您的原始回购库中访问。
查看更新...我宁可不采取这种方法。 – normmcgarry 2014-12-01 17:06:46
先备份你的数据,这个勉强测试!
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
可能重复https://stackoverflow.com/questions/61212/remove-local-untracked-files-from-my-current-git-branch – DRC 2014-12-01 16:47:28
查看更新。我不这么认为。 – normmcgarry 2014-12-01 17:05:21
此时您有一个花园品种过滤分支问题。就像'git filter-branch --index-filter'git rm -rf --cached --ignore-unmatch $ files“HEAD”加上过滤器分支文档中的其他清理步骤应该适合您。 – 2014-12-01 17:55:03