使用git维护mdx字典源码(附大量字典)

你是对的,确实不会全部重写,我新建了一个git-test文件夹,在里面写入了1万x1万的字符,写入后再添加了mmm到文件的最后,确实只增加了一点体积,看来那个书里面写的snapshot和我理解的不一样。:)

after mkdir

0	git-test

after git init

0	git-test/.git/objects/pack
0	git-test/.git/objects/info
0	git-test/.git/objects
8	git-test/.git/info
120	git-test/.git/hooks
0	git-test/.git/refs/heads
0	git-test/.git/refs/tags
0	git-test/.git/refs
152	git-test/.git
152	git-test

after git commit bigsize.txt

904	git-test/.git/objects/a4
0	git-test/.git/objects/pack
0	git-test/.git/objects/info
8	git-test/.git/objects/ba
8	git-test/.git/objects/e7
920	git-test/.git/objects
8	git-test/.git/info
8	git-test/.git/logs/refs/heads
8	git-test/.git/logs/refs
16	git-test/.git/logs
120	git-test/.git/hooks
8	git-test/.git/refs/heads
0	git-test/.git/refs/tags
8	git-test/.git/refs
1112	git-test/.git
196464	git-test

after trail mmm

904	git-test/.git/objects/a4
8	git-test/.git/objects/d9
0	git-test/.git/objects/pack
8	git-test/.git/objects/72
904	git-test/.git/objects/00
0	git-test/.git/objects/info
8	git-test/.git/objects/ba
8	git-test/.git/objects/e7
1840	git-test/.git/objects
8	git-test/.git/info
8	git-test/.git/logs/refs/heads
8	git-test/.git/logs/refs
16	git-test/.git/logs
120	git-test/.git/hooks
8	git-test/.git/refs/heads
0	git-test/.git/refs/tags
8	git-test/.git/refs
2032	git-test/.git
197384	git-test
1 个赞

上面书里用快照来形容没什么问题,快照是整体的概念,是相对于整个仓库的结构来说的,每次commit,都会把整个仓库的结构完整提交一份,具体到文件的完整性上,大文件每次修改commit时确实会只保存修改的部份,但同时会新增一条指向原文件的链接。对于小文本,特别是代码文件,每次修改后的commit都是保存的全新的完整的文本,而不是差异,这样的好处是在任意版本之间切换都非常迅速,省掉merge diff的时间,很适合代码编辑的工作。

可以使用如下命令查看每个object的文本内容:

git cat-file -p <object-id>
2 个赞

这个要看所修改文件是如何在硬盘上存储的。

从git的原理(源码)上看,它与Linux的文件系统的实现有很多类似的地方(毕竟都是Linus本人原创)。

  • 比如一个1000M的编译成mdx之前的单一txt文件,开放给50人修改。如果每人在不同的地方各修改了一个字符,那么git在服务器硬盘上会分别生成50个1000M的txt文件。
  • 假如这个单一txt文件有1000个词条、改由每个词条存在1000个1M的文件中,这50人修改过后,git在服务器硬盘上只会分别生成50个1M的txt文件。

当然出于git版本管理的需要,还会产生多个object文件,但都是个头很小的快照文件。

1 个赞

这不是git的工作方式

我非常支持和乐意在任何(我能想到的)需要进行纯文本版本管理和协作的场合推广 git ,为此我愿意挖这个坟。
针对前面大家对 git 存储方式的讨论,我提供一些额外的信息:

除此之外,为了做进一步的存储优化和方便统一的排错和统一的格式编辑,我认为一种良好的实践是把 mdx 源文本里的格式提取出来,变成【待填充的 HTML】+【词典数据】=>【待编译的 mdx 原文本】=>【 mdx 】这样的流程,我们只需要在 git 里存放第一部分就可以了。