所以,我整个上午一直在寻找正确的方法来做到这一点,而且我并不是那个精明的命令行来解决这个问题。
我有一个git repo,里面有大量资产。我知道,这就像主要的罪恶。
回购已经变得太大了。我想清理它,以便我可以从repo的整个历史中以编程方式删除HEAD中不存在的所有文件。我已经看到了这样做的方法,您可以指定文件路径,但实际上,我说的是1000多个文件已从我们的最终产品中删除,我真的不在乎我的回购了。
更新
我已经清理了首先不应该存在的所有资产的回购。我现在真的只有源代码和一些应该在那里的资产。我真的很想保留所有源代码的所有历史...所以我真的希望从历史中删除已删除的文件,同时保留当前存在的历史记录。这就是目标。我很确定可以使用git filter-branch
来完成 - 但我不太了解它。
答案 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