lab 24 Git Internals:
The .git directory
Goals
- Learn about the structure of the
.git
directory
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.