RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1008511
Accepted
Sirop4ik
Sirop4ik
Asked:2020-07-31 14:59:35 +0000 UTC2020-07-31 14:59:35 +0000 UTC 2020-07-31 14:59:35 +0000 UTC

git如何存储历史记录?以及如何清洁它?

  • 772

今天不得不思考git是如何存储历史的?

问题很简单,假设我创建了一个项目,将非常重的文件(2 GB)放入其中并提交。然后我从我这里删除了这些文件并再次提交。但是我可以回到之前的提交并取回这些文件,对吧?那么由此可知,在删除文件的时候,git仍然会保存它们的副本,也就是说删除重文件时,项目(文件夹本身)的权重和占用的空间不会减少吗?

但是由于某种原因,在我看来,当我克隆一个项目分支时,我并没有得到整个历史记录(例如,在我们的示例中,过去的提交和 2GB 的大文件),至少在本地,它们不在我电脑上的文件。

但毕竟,我有提交的历史,这意味着必须保存所有文件(不知何故,某处)......

简而言之,这里没有加起来。

问题是,是否保留了所有文件副本?如果该项目已有 10 年历史,并且在此期间已经删除了一百万个文件(及其权重),它们是否仍存储在 git 中的某个位置?

git
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Total Pusher
    2020-07-31T15:14:40Z2020-07-31T15:14:40Z

    Git仍然保留它们的副本,这意味着删除重文件时项目(文件夹本身)的权重及其占用的空间不会减少

    是的,这是正确的。让我们检查:

    # так смотрим размер каталога .git
    du -hs .git
    # так можно сделать файл 1Мб
    dd if=/dev/zero of=filename bs=1M count=1
    
    • 空项目 104 Kb
    • 提交 1MB 文件后filename,权重为.git164 KB(git 压缩数据)
    • 文件删除filename和提交后 - 180 Kb

    但是由于某种原因,在我看来,当我克隆一个项目分支时,我并没有得到整个历史记录

    只是在你看来

    如果该项目已有 10 年历史,并且在此期间已经删除了一百万个文件(及其权重),它们是否仍存储在 git 中的某个位置?

    是的

    如何减小.git目录的大小:

    • 运行git gc --aggressive,但它只会清理不必要的文件,并压缩数据,但文件filename将保留在 repo 中,但空间已被释放:它已成为 152Kb
    • 重写历史git rebase:删除一些东西,合并一些东西
    • 下载没有完整历史的 repo:git clone --depth 1 ...将历史下载到深度 1

    对于存储大文件(多媒体),最好使用Git Large File Storage

    混帐 gc

    这是一个“git 数据库”优化实用程序命令。这个数据库中的一些对象变得无法访问(你会遇到更多沉浸在 git 中,它们在“重写历史”时出现)——它们被删除了。数据被压缩,因为索引在操作过程中变得不是很优化,所以它被“重建”了。对于存储库本身,可以“从外部”看到,git gc调用时没有任何反应,整个历史记录仍然存在。

    如果我在本地清理 .git,那么这些更改是否会同步到远程仓库?

    • 通过git gc- 不,这个命令是本地使用的,它优化了本地repo,push之前做绝对没有意义,远程repo有“自己的垃圾”,只有进入远程服务器才能清理远程repo并git gc在裸仓库中运行它
    • 如果你提交,提交,最后,在推送之前(这非常重要!!!)决定减少 repo 的大小 - 使用git rebase:通过合并提交,你将“尊重历史”(有一个巨大的文件在第一次提交,并在第二次提交中被删除) - 当这个巨大的文件不会被传输到远程仓库时,这是主要的事情。并且在本地仓库中,大小会在那.git之后增长rebase- 通过“变基历史”。目录中的那个巨大文件.git也将作为一个压缩对象保留,尽管无法访问(因为您更改了历史记录)。但是运行git gc现在将从.git该文件和本地存储库中删除

    但是,据我了解,它们并不相同,因为裸仓库位于远程

    你理解正确。而对于分布式版本控制系统,即 git,“克隆”只能在克隆时与“远程”完全一样。此外,随着提交的出现,在字节级别上它们开始越来越分歧。历史可能并且将会匹配,但目录.git不匹配。本质上.git,这是一个数据库,您需要像使用数据库一样使用它,而不是在文件和字节级别。git gc也不需要人为启动,git 开始运行缓慢时会建议自己启动,如果gc.auto 1.

    • 17

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5