它是在git文档中编写的,每个提交快照均已完成。强烈强调git不会将文件存储为一系列差异,而是存储为一系列快照。还突出显示了快照包含文件的副本(如果文件被更改的话)。因此,让我们沉浸其中:
git init
git add file.bin # (file.bin has 1024 MB)
git commit -m "."
ls -l --block-size=M -a
drwxr-xr-x 1 john 197121 0M lis 13 08:27 .git/
-rw-r--r-- 1 john 197121 1024M lis 13 08:19 file.bin
echo "X" >> file.bin # file was changed
git commit -am "Changed file.bin"
ls -l --block-size=M -a
drwxr-xr-x 1 john 197121 0M lis 13 08:27 .git/
-rw-r--r-- 1 john 197121 1025M lis 13 08:19 file.bin
因此,.git
'的大小仍小于1 MB。它显示file.bin
没有被复制。为什么?
答案 0 :(得分:2)
.git的大小不会随代码库的大小线性增加。如果真是这样,那么将需要大量空间来存储。此说明摘自article。请阅读以获取更深入的解释。
实际上,当您提交git时,只有两件事可以创建工作目录的快照:
- 列表项
- 如果文件没有更改,则git只会将压缩文件的名称(哈希)添加到快照中。
- 如果文件已更改,则git对其进行压缩,然后将压缩后的文件存储在对象文件夹中。最后,它将压缩文件的名称(哈希)添加到快照中。
这是一个简化,整个过程有点复杂,将成为以后的帖子的一部分。
一旦创建了快照,快照也将被压缩并以哈希命名,所有这些压缩对象都在哪里结束?在对象文件夹中。
答案 1 :(得分:1)
使用ls -l
命令时,文件夹的大小不是其所有组件的大小,而是文件夹本身的大小(在Linux上,文件夹是一个简单的小文件)
要实现所需的功能,应使用du -sh
命令。
du -sh * # print size of all non-hidden files in directory
du -sh .[^.]* # print size of all hidden files in directory