我有一个存储库,用于存储一些非常大的二进制文件(tifs,jpgs,pdfs).还有相当数量的文件被创建,删除和重命名,我不关心单个提交历史记录.这个问题有点简化,因为我正在处理一个没有分支而没有标签的存储库.
我很好奇是否有一种简单的方法可以从系统中删除一些历史记录以节省空间.
我在git邮件列表上找到了一个旧线程,但它并没有真正指定如何使用它(即$ drop是什么):
git filter-branch --parent-filter "sed -e 's/-p $drop//'" \
--tag-name-filter cat -- \
--all ^$drop
Run Code Online (Sandbox Code Playgroud)
我想,你可以根据这个答案收缩你的历史:
确定您希望保留的历史记录中的哪些点.
pick <hash1> <commit message>
pick <hash2> <commit message>
pick <hash3> <commit message> <- keep
pick <hash4> <commit message>
pick <hash5> <commit message>
pick <hash6> <commit message> <- keep
pick <hash7> <commit message>
pick <hash8> <commit message>
pick <hash9> <commit message>
pick <hash10> <commit message> <- keep
Run Code Online (Sandbox Code Playgroud)
然后,在每次"保持"作为"选择"之后留下第一个,并将其他人标记为"壁球".
pick <hash1> <commit message>
squash <hash2> <commit message>
squash <hash3> <commit message> <- keep
pick <hash4> <commit message>
squash <hash5> <commit message>
squash <hash6> <commit message> <- keep
pick <hash7> <commit message>
squash <hash8> <commit message>
squash <hash9> <commit message>
squash <hash10> <commit message> <- keep
Run Code Online (Sandbox Code Playgroud)
然后,通过保存并退出编辑器来运行rebase.在每个"保持"点,消息编辑器将弹出一个组合的提交消息,范围从前一个"选择"到"保持"提交.然后,您可以保留最后一条消息,或者实际上将这些消息组合起来记录原始历史记录,而不保留所有中间状态.
在该rebase之后,中间文件数据仍将在存储库中但现在未引用.git gc现在确实可以让你摆脱那些数据.
您可以随时删除.git并git init使用一次初始提交执行新操作.当然,这将删除所有提交历史记录.