14

我有一个存储库,用于存储一些越来越大的大型二进制文件(tifs、jpgs、pdfs)。还有相当数量的文件被创建、删除和重命名,我不关心单个提交历史。这个问题有些简化,因为我正在处理一个没有分支和标签的存储库。

我很好奇是否有一种简单的方法可以从系统中删除一些历史记录以节省空间。

我在 git 邮件列表中找到了一个旧线程,但它并没有真正指定如何使用它(即 $drop 是什么):

git filter-branch --parent-filter "sed -e 's/-p $drop//'" \
        --tag-name-filter cat -- \
        --all ^$drop 
4

5 回答 5

10

您总是可以删除.git并重新git init进行一次初始提交。当然,这将删除所有提交历史记录。

于 2012-10-12T18:57:49.023 回答
10

我认为,您可以按照以下答案缩小历史记录:

如何删除 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

然后,将每个“保留”之后的第一个保留为“选择”,并将其他标记为“壁球”。

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。在每个“keep”点,消息编辑器将弹出一个组合提交消息,范围从先前的“pick”到“keep”提交。然后,您可以只保留最后一条消息,或者实际上将它们组合起来以记录原始历史记录,而不保留所有中间状态。

在那次变基之后,中间文件数据仍将在存储库中,但现在未引用。git gc现在确实会让你摆脱这些数据。

于 2012-10-12T21:13:50.470 回答
3

$drop 是一个变量(你想要寻找的)

如果要清理不必要的文件并优化本地存储库,则必须检查命令git gc

并且git prune是另一种选择,因为它删除了任何可到达分支中的任何对象不再指向的对象。

我希望这可以帮助你。

于 2012-10-12T19:06:18.410 回答
2

如果您想从 Git 历史记录中查找和删除大文件,Pro Git有一个名为Removing Objects的部分,它会指导您完成此过程。这有点复杂,但它可以让您从历史记录中删除无论如何都已删除的文件,同时保持其余历史记录完好无损。

于 2012-10-13T04:25:14.160 回答
1

让 git 忘记文件有点复杂。

git rm从现在开始只会删除该分支上的文件,但它会保留在历史记录中,git 会记住它。

git filter-branch正如其他人在这里提到的那样,正确的方法是使用。它将重写分支历史记录中的每个提交以删除该文件。

但是,即使在这样做之后,git 仍然可以记住它,因为在 reflog、remote、tags 等中可以引用它。

我写了一个小工具叫做git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

这很容易,只要做git forget-blob file1.txt

这将删除所有引用,做git filter-branch,最后运行 git 垃圾收集器git gc以完全摆脱你的 repo 中的这个文件。

于 2017-02-02T09:48:42.137 回答