有没有办法强制Git将文件版本存储为完整且独立的实体,而不是作为来自上游提交的差异存在的下游提交?
有些人会问我为什么要这样做。我想这样做是因为老板告诉我这样做。 FWIW,有问题的特定文件是一个过程的产物,其中输入中的一个小变化可能导致文件的重大重组。
答案 0 :(得分:7)
Git的对象存储已经做到了,而且它是不可协商的。
Git的对象数据库是面向快照的,单个文件是blob
,目录是tree
个对象。
通过查看.git/objects
或执行
git rev-list --objects --all
现在,过了一段时间,为了提高效率,对象数据库将被“压缩”(称为打包)。这样可以提高存储效率,但不会涉及增加增量。
存储deltas由RCS,CVS,Subversion和其他人(SourceSafe?)推广。主要是因为模型可以很容易地转换变更集,因为它们已经是delta形式。现代VCS-es(主要是分布式的)已经发展而已,并强调数据完整性。
由于对象数据库的设计,git非常强大,可以在快照或整个存储库中的任何位置检测到任何损坏的数据。有关Git存储库的加密属性的更多详细信息,请参阅此文章:Linus talk - Git vs. data corruption?
在techno babble中:提交历史形成加密强大的merkle树。当提示提交(HEAD)的sha1总和匹配时,它在数学上遵循
是完全相同的。这是git(以及共享此设计功能的其他SCM)的巨大安全功能
答案 1 :(得分:2)
Git对象存储为完整文件。 (除非你gc
你的回购,然后他们得到优化 - 但这是一个实现细节)。如果你知道文件的git sha,你可以通过以下方式完整地获取它:
git cat-file -p <sha>
将根据其类型输出文件。
您可以在365git - Git Objects: The Blog
上看到有关此内容的文章