Skip to content

lab 24 Git Internals:
The .git directory

Goals

The .git Directory

Time to do some exploring. First, from the root of your project directory…

Execute:

ls -C .git

Output:

$ ls -C .git
COMMIT_EDITMSG	ORIG_HEAD  config	hooks  info  objects	  refs
HEAD		branches   description	index  logs  packed-refs

This is the magic directory where all the git “stuff” is stored. Let’s peek in the objects directory.

The Object Store

Execute:

ls -C .git/objects

Output:

$ ls -C .git/objects
00  15	1d  28	31  3a	3e  41	43  69	7d  8c	91  9d	a7  b2	c7  fc	  pack
11  19	27  2f	35  3d	3f  42	59  78	87  90	9c  a2	af  b7	d6  info

You should see a bunch of directories with 2 letter names. The directory names are the first two letters of the sha1 hash of the object stored in git.

Deeper into the Object Store

Execute:

ls -C .git/objects/<dir>

Output:

$ ls -C .git/objects/00
22837ea47af65b8aadf78560c8edde8211d475

Look in one of the two-letter directories. You should see some files with 38-character names. These are the files that contain the objects stored in git. These files are compressed and encoded, so looking at their contents directly won’t be very helpful, but we will take a closer look in a bit.

Config File

Execute:

cat .git/config

Output:

$ cat .git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[user]
	name = Jim Weirich
	email = jim (at) edgecase.com

This is a project-specific configuration file. Config entries in here will override the config entries in the .gitconfig file in your home directory, at least for this project.

Branches and Tags

Execute:

ls .git/refs
ls .git/refs/heads
ls .git/refs/tags
cat .git/refs/tags/v1

Output:

$ ls .git/refs
heads
tags
$ ls .git/refs/heads
main
$ ls .git/refs/tags
v1
v1-beta
$ cat .git/refs/tags/v1
1dee7f9aea43849aaa80edbc7bc43e63eb6f5315

You should recognize the files in the tags subdirectory. Each file corresponds to a tag you created with the git tag command earlier. Its content is just the hash of the commit tied to the tag.

The heads directory is similar, but is used for branches rather than tags. We only have one branch at the moment, so all you will see is main in this directory.

The HEAD File

Execute:

cat .git/HEAD

Output:

$ cat .git/HEAD
ref: refs/heads/main

The HEAD file contains a reference to the current branch. It should be a reference to main at this point.