清除 git 中的旧提交并在 .git 中创建 space

clear old commits from git and make space in .git

我正在尝试清除 .git 文件夹中的 space。我对我网站上的图像进行版本控制,并在我的 .git 文件夹增长到超过 1gb 时用尽了我的 bitbucket space。我的解决方案是将我的图像移出本地目录并移至 s3 存储桶中。

我不太关心旧的提交,所以我希望删除它们并重新开始。

我采用了这种方法: how to delete all commit history in github?

按照 link 中的步骤:

结帐 git checkout --orphan latest_branch

添加所有文件 git add -A

提交更改 git commit -am "commit message"

删除分支 git branch -D main

将当前分支重命名为main git branch -m main

强制更新您的存储库 git push -f origin main

然后终于 git gc -- aggressive -- prune=all

这可以清除我的 bitbucket 帐户中的提交,但是 .git 文件夹的大小没有改变,它仍然是 1gb。我以为 git gc 会清除旧文件,但它似乎不起作用。

此时如何从我的 git 文件夹中清除旧文件?

我认为这里真正的问题是:

  1. 为什么我所做的事情没有显着减小 .git 文件夹的大小?

  2. 我应该怎么做?

为了找到答案,让我们谈谈提交是如何消亡的。要理解这一点,您需要了解提交如何 can't 消亡。以下是您需要了解的内容:

  • 分支只是一次提交的名称。标签名称也是如此。

  • 每个提交至少有一个“parent”——除了你做过的第一个提交(“root”提交)和你可能创建的任何“孤儿”提交.

  • 如果一个提交有一个名字——也就是说,一个分支名或标签名指向它——它不会死。

  • 如果提交是活着的提交的parent,它不会死。

那么现在。如果那是一个提交不会死的方式,那么 怎么 一个提交会死?好吧,要使提交死亡,必须是 没有分支或标记名称 指向调用 this 提交的提交parent 在任何深度。换句话说,想象一个提交链 parentage;好吧,只有当 no 以分支或标记名称开始的提交链 parentage 到达它时,提交才会死亡。

好的,现在我们来谈谈做了什么。您删除了 main,希望这会导致所有现有提交终止。但他们好像没有。那么让我问你:main 是你拥有的 唯一分支 吗?因为如果不是,那么所有其他分支名称仍然存在,并且它们会保持所有 parent 活动 一直回到根提交。

此外,您还有一个遥控器。所以你也有 remote-tracking 分支 反映了那个遥控器的状态。所以除了 你的 main,你还有一个 origin/main。你所做的没有影响。因此 origin/main 使您所有的提交保持活动状态,一直回到根提交

所以你所做的可能不会导致 任何 提交死亡!

这就可以解释为什么你的 .git 文件夹在你做了这些之后没有明显变小。

所以,要像 那样正确地做,你需要说 git branch 来找出你有哪些分支,然后删除每个分支分支机构。另外,您需要说 git tag --list 才能找出您拥有的标签,然后删除每个标签。

但即使这样还不够,因为您拥有的所有 remote-tracking 分支机构呢?要查看这些,您会说 git branch --remote。您还需要删除所有这些远程分支!但是您不能只删除它们;您必须推送 删除。对于每个 remote-tracking 分支,您需要说 git push --delete origin <branchname>.

听起来工作量很大,不是吗?

这就是为什么做您想做的事情的最简单方法就是检查您喜欢的事物的状态,大概是 main,然后 扔掉整个.git 文件夹。 然后说 git init 并重新提交。也扔掉你的遥控器并制作一个新的遥控器。用 git remote add 将两者挂钩,并将您全新的干净存储库推送到分支 new clean remote.