git - blob 是否包含文件的当前状态或仅包含最后一次更改?
问题描述
假设您有新的 git 存储库并添加一个文件 README.MD 并写入
foo
到该文件并首次提交该文件。据我了解,git 在提交时会创建三个新对象:blob、树和提交。提交对象引用树,而树又引用树或 blob。
假设您进行了第二次提交,将 bar 添加到 README.MD,因此文件如下所示:
foo
bar
并提交此文件,为该提交创建一个新的 blob。那个新的blob是否成立
foo
bar
或仅最后一次更改:
bar
?
解决方案
正确答案是 (c):最近的 blob 包含它们所代表的文件的完整(压缩)内容,但文件的旧版本可以移动到packfiles 中:
当 Git 打包对象时,它会查找名称和大小相似的文件,并仅存储从一个文件版本到下一个文件版本的增量。你可以查看包文件,看看 Git 做了什么来节省空间。git verify-pack 管道命令允许您查看打包的内容:
稍后,解释一个详细的例子:
在这里,033b4 blob,如果您记得是 repo.rb 文件的第一个版本,它正在引用 b042a blob,这是该文件的第二个版本。输出中的第三列是包中对象的大小,所以可以看到 b042a 占用了文件的 22K,而 033b4 只占用了 9 个字节。同样有趣的是,文件的第二个版本是完整存储的,而原始版本是作为增量存储的 ——这是因为您很可能需要更快地访问文件的最新版本.
如果 git 总是单独存储每个文件的每个版本,那么它就无法处理很长的历史。它永远不会成功。
git cat-file
以及对文件内容进行操作的所有其他 git 命令透明地提取打包文件,因此您甚至不必知道这种情况正在发生。
另请参阅git 如何存储文件?
推荐阅读
- python - 决策树的网格搜索参数
- excel - 测试 Office 加载项
- oracle - 为 Jdeveloper 12c 配置 SOA 扩展
- python - 如何编写将我的数据框的列转换为单列的功能?
- linux - 无法理解 bash 管道行为
- python - Anaconda 导航器 GUI 未在 Windows 10 中的新安装上加载
- xml - 将 MSXML2.XMLHTTP 从经典 ASP 转换为 VB.NET
- linux - 无法在 Docker 容器中使用 sudo 编辑环境文件
- sql-server - SSIS在每次加载时加载不同列数的CSV
- r - 如何获得对 Google Cloud 中 AI Platform R 3.6 笔记本实例中库文件夹的写入权限