Build your own Git

Early Access

In this challenge, you’ll build a Git implementation that can initialize a repository, create commits and clone a public repository from GitHub. Along the way, you’ll learn about the .git directory, a few of Git’s “plumbing” commands, Git objects (blobs, commits, trees etc.), Git’s transfer protocols and more.

This challenge has 7 stages.


Initialize the .git directory

In this stage, you’ll implement the git init command. You’ll initialize a git repository by creating a .git directory and some files inside it.


Read a blob object

In this stage, you’ll read a blob from your git repository by fetching its contents from the .git/objects directory.

You’ll do this using the first of multiple “plumbing” commands we’ll encounter in this challenge: git cat-file.


Create a blob object

In the previous stage, we learnt how to read a blob. In this stage, we’ll persist a blob by implementing the git hash-object command.


Read a tree object

Now that we’ve learnt how to read/write blobs, let’s move onto our next Git object: the tree. In this stage, you’ll read a tree object from storage by implementing the git ls-tree command.


Write a tree object

In this stage, you’ll write a tree to git storage by implementing the git write-tree command.

To keep things simple, we won’t implement an index, we’ll just assume that all changes in the worktree are staged.


Create a commit

Let’s move on to the last git object we’ll be dealing with in this challenge: the commit. In this stage, you’ll create a commit by implementing the git commit-tree command.


Clone a repository

This is the last stage of the challenge, and probably the hardest! In this stage, you’ll clone a public repository from GitHub. To do this, you’ll use one of Git’s Transfer protocols.

Interested in trying out the Build your own Git Challenge? Checkout our early access program!