lab 22 Git Internals:
The .git directory
- Learn about the structure of the
Time to do some exploring. First, from the root of your project directory…
ls -C .git
$ ls -C .git COMMIT_EDITMSG ORIG_HEAD hooks logs rr-cache HEAD config index objects MERGE_RR description info refs
This is the magic directory where all the git “stuff” is stored. Let’s peek in the objects directory.
The Object Store
ls -C .git/objects
$ ls -C .git/objects 06 18 28 44 69 8c 9c c4 e4 info 09 24 42 4d 6b 97 af d5 e7 pack 11 27 43 59 78 9a b5 dc ed
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
ls -C .git/objects/<dir>
$ ls -C .git/objects/06 3b40ead4efa2dce10ca893772c83483f0b546b
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.
$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = 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
ls .git/refs ls .git/refs/heads ls .git/refs/tags cat .git/refs/tags/v1
$ ls .git/refs heads tags $ ls .git/refs/heads master $ ls .git/refs/tags v1 v1-beta $ cat .git/refs/tags/v1 4d578d47c426d4d94fcb3c645fe29c27138f3900
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 master in this directory.
The HEAD File
$ cat .git/HEAD ref: refs/heads/master
The HEAD file contains a reference to the current branch. It should be a reference to master at this point.