Git:如何处理具有共享历史记录的文件副本?

问题描述

我像这样将我的 CSS 用户样式备份到一个 git 存储库:

❯ fd                                                                                            
stylus-2021-05-18.json
stylus-2021-05-20.json

这些备份文件显然大体相同,即stylus-2021-05-18.jsonstylus-2021-05-20.json的过去历史。 git 是如何处理的?

显然,我可以将文件重命名为 stylus.json 并让 git 完全处理版本控制,但我想知道 git 是否足够智能,可以处理这些文件自动。

解决方法

纯粹从技术角度来看很容易:如果 git 历史记录中的两个文件具有完全(逐字节)相同的内容,那么它们将引用 the same blob object* 和实际内容只会存储一次。因此,如果您当前的 fileA 版本与 2 次提交前的 fileB 相同,那么它们仍然只会在 .git 子目录中存储一次。无论文件是否具有不同的名称、是否在同一个提交中或在不同的路径中,这都有效:只要内容相同,blob 就会被重用。

另一方面:如果这种情况发生得太频繁,那么这表明您正在以一种并非真正要使用的方式使用版本控制:给定的提交不应包含任何“历史数据”或“存档”:这就是其他提交/标签/分支的用途。任何给定分支的 HEAD 都应准确地(且仅)包含当前与该分支相关的内容。但这部分不是技术上需要的:它只是通常如何使用 git 的约定。

* 请注意,这种重用甚至可以达到目录级别,即如果两个目录包含相同的子目录和文件,它们将引用相同的树对象。这使得存储“非常相似”的提交非常有效:实际上只有差异才需要另外存储。请注意,提交仍然是 snapshots and not diffs

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...