# Curious about details of optimization of object database...

5 messages from 2009-01-09 to 2009-01-09. Participants: chris@seberino.org, David Brown, Matthieu Moy, Nicolas Pitre, Boyd Stephen Smith Jr..
Thread: https://gitlist.dev/t/17062

## chris@seberino.org, 2009-01-09 17:46

Subject: Curious about details of optimization of object database...
Message-ID: <20090109174623.GC12552@seberino.org>
URL: https://gitlist.dev/e/20090109174623.GC12552%40seberino.org

```
I'm told a commit is *not* a patch (diff), but, rather a copy of the entire
tree.

Can anyone say, in a few sentences, how git avoids needing to keep multiple
slightly different copies of entire files without just storing lots of
patches/diffs?

cs

```

## Matthieu Moy, 2009-01-09 17:55

Subject: Re: Curious about details of optimization of object database...
Message-ID: <vpqzli01hzl.fsf@bauges.imag.fr>
URL: https://gitlist.dev/e/vpqzli01hzl.fsf%40bauges.imag.fr
In-Reply-To: <20090109174623.GC12552@seberino.org>

```
chris@seberino.org writes:

> I'm told a commit is *not* a patch (diff), but, rather a copy of the entire
> tree.

Conceptually, yes. But obviously, the storage format (pack) does what
people usually call "delta-compression", which is basically storing
only the diff against another, similar object.

-- 
Matthieu

```

## David Brown, 2009-01-09 17:56

Subject: Re: Curious about details of optimization of object database...
Message-ID: <20090109175619.GA807@linode.davidb.org>
URL: https://gitlist.dev/e/20090109175619.GA807%40linode.davidb.org
In-Reply-To: <20090109174623.GC12552@seberino.org>

```
On Fri, Jan 09, 2009 at 09:46:23AM -0800, chris@seberino.org wrote:
>I'm told a commit is *not* a patch (diff), but, rather a copy of the entire
>tree.
>
>Can anyone say, in a few sentences, how git avoids needing to keep multiple
>slightly different copies of entire files without just storing lots of
>patches/diffs?

   Documentation/technical/pack-heuristics.txt

David

```

## Nicolas Pitre, 2009-01-09 18:34

Subject: Re: Curious about details of optimization of object database...
Message-ID: <alpine.LFD.2.00.0901091330010.9524@xanadu.home>
URL: https://gitlist.dev/e/alpine.LFD.2.00.0901091330010.9524%40xanadu.home
In-Reply-To: <vpqzli01hzl.fsf@bauges.imag.fr>

```
On Fri, 9 Jan 2009, Matthieu Moy wrote:

> chris@seberino.org writes:
> 
> > I'm told a commit is *not* a patch (diff), but, rather a copy of the entire
> > tree.
> 
> Conceptually, yes. But obviously, the storage format (pack) does what
> people usually call "delta-compression", which is basically storing
> only the diff against another, similar object.

Also, since objects representing files and directories are named after 
their actual content, having two commits with identical files and 
directories will of course share the same blob and tree objects for 
those identical parts.


Nicolas

```

## Boyd Stephen Smith Jr., 2009-01-09 19:07

Subject: Re: Curious about details of optimization of object database...
Message-ID: <200901091307.33483.bss@iguanasuicide.net>
URL: https://gitlist.dev/e/200901091307.33483.bss%40iguanasuicide.net
In-Reply-To: <20090109174623.GC12552@seberino.org>

```
On Friday 2009 January 09 11:46:23 chris@seberino.org wrote:
>I'm told a commit is *not* a patch (diff), but, rather a copy of the entire
>tree.

It's even more than that.  A commit object contains its message, the SHA of 
the tree, and zero or more SHAs for its parents.

>Can anyone say, in a few sentences, how git avoids needing to keep multiple
>slightly different copies of entire files without just storing lots of
>patches/diffs?

Loose objects can have large swaths of duplicated data.  However, git also 
supports storing objects in a packed format, which uses delta compression to 
reduce the duplication to close to nothing.

Some examples:
Sizes are from "du -sh .git ."; The .git directory stores all the objects as 
well as the repository configuration, refs, reflogs, etc.  The . directory 
has .git and a clean checkout of master.

The LinuxPMI (http://linuxpmi.org/) tree:
41M     .git
83M     .
(So, the storage is actually a bit smaller than the checkout; 984 objects; 140 
commits)

A small project between me an my flatmates:
309K    .git
3.6M    .
(Here, the storage is significantly smaller than the checkout; 786 objects; 
155 commits)

My repository that tracks my dotfiles:
124K    .git
176K    .
(113 objects; 28 commits)
-- 
Boyd Stephen Smith Jr.                     ,= ,-_-. =. 
bss@iguanasuicide.net                     ((_/)o o(\_))
ICQ: 514984 YM/AIM: DaTwinkDaddy           `-'(. .)`-' 
http://iguanasuicide.net/                      \_/     

```
