我正在尝试清除.git文件夹中的空间。我对我的网站上的图像进行了版本控制,当我的.git文件夹增长到超过1gb时,我的比特桶空间达到了最大。我的解决方案是将我的映像从本地目录中移到s3存储桶中。
我真的不在乎旧的提交,所以我希望删除它们,重新开始。
我采用了这种方法:如何删除github中的所有提交历史记录?
根据链接中的步骤:
签出git checkout --orphan latest_branch
添加所有文件git add -A
提交更改git commit -am "commit message"
删除分支git branch -D main
将当前分支重命名为maingit branch -m main
强制更新存储库git push -f origin main
然后最后git gc -- aggressive -- prune=all
这可以清除我的bitbucket帐户中的提交,但.git文件夹的大小没有改变,仍然是1gb。我以为git-gc会清除旧文件,但它似乎不起作用。
在这一点上,我如何才能从我的git文件夹中清除旧文件?
我认为这里真正的问题是:
-
为什么我所做的事情没有显著减少.git文件夹的大小?
-
我该怎么办?
为了找到答案,让我们来谈谈提交是如何消亡的。要理解这一点,您需要知道提交是如何不能死亡的。以下是您需要了解的内容:
-
分支只是一个提交的名称。标签名称也是如此。
-
每个提交都至少有一个";父"——除了你做出的第一次承诺("根"承诺(和任何"根";孤儿;您可以创建的提交。
-
如果提交有一个名称——也就是说,分支名称或标记名称指向它——它就不会死
-
如果commit是活动的commit的父级,则它不会死
现在。如果这就是一个commit不会死的原因,那么一个commit怎么会死?好吧,对于一个提交来说,必须是没有分支或标记名指向一个在任何深度调用this提交其父级的提交。换言之,想象一下一系列忠诚的父母关系;好吧,只有当no以分支或标记名开头的提交父级链到达时,提交才会终止。
好吧,现在让我们谈谈你做了什么。您删除了main
,希望这会导致所有现有的提交都终止。但他们似乎没有。所以让我问你:main
是你拥有的唯一的分支吗?因为如果不是,那么所有其他分支名称仍然存在,并且它们一直保持其所有父分支的活动直到根提交
此外,你还有一个遥控器。因此,您还有远程跟踪分支,它们反映了该远程的状态。所以除了你的main
,你还有一个origin/main
。你所做的一切对此没有任何影响。因此,origin/main
使所有提交保持活动状态,一直返回到根提交。
所以你所做的可能并没有导致任何提交死亡!
这就解释了为什么你的.git文件夹在你这样做之后并没有明显变小。
因此,要以您的方式正确执行,您需要说git branch
来找出您有哪些分支,并删除这些分支中的每一个。另外,你需要说git tag --list
来找出你有什么标签,并删除每个标签。
但即使这样也不够,因为你拥有的所有远程跟踪分支机构呢?要看到这些,你可以说git branch --remote
。你也需要删除所有的远程分支!但你不能只是删除它们;您必须推送删除。对于每个远程跟踪分支,您需要说git push --delete origin <branchname>
。
听起来工作量很大,不是吗?
这就是为什么做你想做的事情最简单的方法就是签出你喜欢的东西的状态,大概是main
,然后扔掉整个.git文件夹然后说git init
,然后重新提交。也扔掉你的遥控器,做一个新的遥控器。使用git remote add
将两者连接在一起,并将您全新的clean存储库推送到分支新的clean远程。