从git存储库中删除旧的提交信息以节省空间

gre*_*les 13 git

我有一个存储库,用于存储一些非常大的二进制文件(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)

Til*_*gel 9

我想,你可以根据这个答案收缩你的历史:

如何删除github gist的特定修订版?

确定您希望保留的历史记录中的哪些点.

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现在确实可以让你摆脱那些数据.

  • 如果我只是压缩每个提交(或 X 日期之前的每个提交),这似乎可能会有所帮助,但这似乎很乏味。有没有更自动化的方法来做到这一点? (2认同)
  • 通过删除提交,您将删除元数据和对树数据的引用。如果这意味着最后一个引用被删除(没有其他提交引用特定内容),则实际有效负载将在下一个 `gc` 中删除。例如,如果您正在压缩从添加给定文件到再次删除它的提交的所有提交,则文件数据实际上将在 `gc` 处被删除。 (2认同)

ezo*_*zod 8

您可以随时删除.gitgit init使用一次初始提交执行新操作.当然,这将删除所有提交历史记录.

  • 基本上:`move .git /somewhere/else; git 初始化;git 添加 .; git commit -m“初始提交”;git add origin [repoUrl]; git push origin --force` (4认同)
  • 是的,绝对认为这是一个简单但激烈的选择。我将归档 .git 存储库,然后执行此操作。我希望事情不那么激烈:) (2认同)