Git快照和文件副本

时间:2018-11-13 07:36:10

标签: git

它是在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没有被复制。为什么?

2 个答案:

答案 0 :(得分:2)

.git的大小不会随代码库的大小线性增加。如果真是这样,那么将需要大量空间来存储。此说明摘自article。请阅读以获取更深入的解释。

  

实际上,当您提交git时,只有两件事可以创建工作目录的快照:

     
      
  1. 列表项
  2.   
  3. 如果文件没有更改,则git只会将压缩文件的名称(哈希)添加到快照中。
  4.   
  5. 如果文件已更改,则git对其进行压缩,然后将压缩后的文件存储在对象文件夹中。最后,它将压缩文件的名称(哈希)添加到快照中。
  6.   
     

这是一个简化,整个过程有点复杂,将成为以后的帖子的一部分。

     

一旦创建了快照,快照也将被压缩并以哈希命名,所有这些压缩对象都在哪里结束?在对象文件夹中。

答案 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