我有一个存储库,用于存储一些增长很大的大型二进制文件(tif,jpgs,pdfs)。还有相当数量的文件被创建,删除和重命名,我不关心单个提交历史记录。这个问题有点简化,因为我正在处理一个没有分支而没有标记的存储库。
我很好奇是否有一种简单的方法可以从系统中删除一些历史记录以节省空间。
我找到了一个旧帖子on the git mailing list,但它并没有真正指定如何使用它(即$ drop是什么):
git filter-branch --parent-filter "sed -e 's/-p $drop//'" \
--tag-name-filter cat -- \
--all ^$drop
答案 0 :(得分:9)
我想,你可以根据这个答案收缩你的历史:
How to delete a specific revision of a 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
然后,在每次之后离开第一个&#34;保持&#34; as&#34; pick&#34;并将其他人标记为&#34;壁球&#34;。
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
然后,通过保存并退出编辑器来运行rebase。在每个&#34;保持&#34;点,消息编辑器将弹出一个组合的提交消息,范围从前一个&#34; pick&#34;直到&#34;保持&#34;承诺。然后,您可以保留最后一条消息,或者实际上将这些消息组合起来记录原始历史记录,而不保留所有中间状态。
在该rebase之后,中间文件数据仍将在存储库中但现在未引用。 git gc
现在确实可以让你摆脱这些数据。
答案 1 :(得分:8)
您可以随时删除.git
并使用一次初始提交执行新的git init
。当然,这将删除所有提交历史记录。
答案 2 :(得分:3)
$ drop是一个变量(你想要寻找)
如果要清理不必要的文件并优化本地存储库,则必须检查命令git gc
而git prune是另一种选择,因为它会删除任何可到达分支中任何对象不再指向的对象。
我希望这可以帮到你。
答案 3 :(得分:1)
如果您想从Git历史记录中查找和删除大型文件,Pro Git会有一个名为Removing Objects的部分,该部分将指导您完成此过程。它有点复杂,但它允许您从历史中删除已删除的文件,同时保持历史的其余部分完整。
答案 4 :(得分:0)
让git忘记文件有点复杂。
git rm
将仅从现在开始删除此分支上的文件,但它仍保留在历史记录中,git会记住它。
正确的做法是使用git filter-branch
,正如其他人在此提到的那样。它将重写分支历史记录中的每个提交以删除该文件。
但是,即使这样做,git也能记住它,因为在reflog,remotes,tags等中可以引用它。
我写了一个名为git forget-blob
这很简单,只需git forget-blob file1.txt
。
这将删除每个引用,执行git filter-branch
,最后运行git垃圾收集器git gc
以完全删除回购中的此文件。