今天不得不思考git是如何存储历史的?
问题很简单,假设我创建了一个项目,将非常重的文件(2 GB)放入其中并提交。然后我从我这里删除了这些文件并再次提交。但是我可以回到之前的提交并取回这些文件,对吧?那么由此可知,在删除文件的时候,git仍然会保存它们的副本,也就是说删除重文件时,项目(文件夹本身)的权重和占用的空间不会减少吗?
但是由于某种原因,在我看来,当我克隆一个项目分支时,我并没有得到整个历史记录(例如,在我们的示例中,过去的提交和 2GB 的大文件),至少在本地,它们不在我电脑上的文件。
但毕竟,我有提交的历史,这意味着必须保存所有文件(不知何故,某处)......
简而言之,这里没有加起来。
问题是,是否保留了所有文件副本?如果该项目已有 10 年历史,并且在此期间已经删除了一百万个文件(及其权重),它们是否仍存储在 git 中的某个位置?
是的,这是正确的。让我们检查:
filename,权重为.git164 KB(git 压缩数据)filename和提交后 - 180 Kb只是在你看来
是的
如何减小
.git目录的大小:git gc --aggressive,但它只会清理不必要的文件,并压缩数据,但文件filename将保留在 repo 中,但空间已被释放:它已成为 152Kbgit rebase:删除一些东西,合并一些东西git clone --depth 1 ...将历史下载到深度 1对于存储大文件(多媒体),最好使用Git Large File Storage
混帐 gc
这是一个“git 数据库”优化实用程序命令。这个数据库中的一些对象变得无法访问(你会遇到更多沉浸在 git 中,它们在“重写历史”时出现)——它们被删除了。数据被压缩,因为索引在操作过程中变得不是很优化,所以它被“重建”了。对于存储库本身,可以“从外部”看到,
git gc调用时没有任何反应,整个历史记录仍然存在。git gc- 不,这个命令是本地使用的,它优化了本地repo,push之前做绝对没有意义,远程repo有“自己的垃圾”,只有进入远程服务器才能清理远程repo并git gc在裸仓库中运行它git rebase:通过合并提交,你将“尊重历史”(有一个巨大的文件在第一次提交,并在第二次提交中被删除) - 当这个巨大的文件不会被传输到远程仓库时,这是主要的事情。并且在本地仓库中,大小会在那.git之后增长rebase- 通过“变基历史”。目录中的那个巨大文件.git也将作为一个压缩对象保留,尽管无法访问(因为您更改了历史记录)。但是运行git gc现在将从.git该文件和本地存储库中删除你理解正确。而对于分布式版本控制系统,即 git,“克隆”只能在克隆时与“远程”完全一样。此外,随着提交的出现,在字节级别上它们开始越来越分歧。历史可能并且将会匹配,但目录
.git不匹配。本质上.git,这是一个数据库,您需要像使用数据库一样使用它,而不是在文件和字节级别。git gc也不需要人为启动,git 开始运行缓慢时会建议自己启动,如果gc.auto 1.