Skip to content

Instantly share code, notes, and snippets.

@ojacobson
Last active December 12, 2015 05:38
Show Gist options
  • Save ojacobson/4723177 to your computer and use it in GitHub Desktop.
Save ojacobson/4723177 to your computer and use it in GitHub Desktop.
Software is not magic

Let's make a git repository out of whole cloth.

Git repos are stored in .git:

fakegit$ mkdir .git

They have a "symbolic ref" (which are text files, see man git-symbolic-ref) named HEAD, pointing to the currently checked-out branch. Let's use master. Branches are refs under refs/heads (see man git-branch):

fakegit ((unknown))$ echo 'ref: refs/heads/master' > .git/HEAD

The have an object database and a refs database, both of which are simple directories (see man gitrepository-layout and man gitrevisions). Let's also enable the reflog, because it's a great safety net if you use history-editing tools in git:

fakegit ((ref: re...))$ mkdir .git/refs .git/objects .git/logs
fakegit (master #)$

Now __git_ps1, at least, is convinced that we have a working git repository. Does it work?

fakegit (master #)$ echo 'Hello, world!' > hello.txt
fakegit (master #)$ git add hello.txt
fakegit (master #)$ git commit -m 'Initial commit'
[master (root-commit) 975307b] Initial commit
1 file changed, 1 insertion(+)
create mode 100644 hello.txt

fakegit (master)$ git log
commit 975307ba0485bff92e295e3379a952aff013c688
Author: Owen Jacobson <[email protected]>
Date:   Wed Feb 6 10:07:07 2013 -0500

    Initial commit

Eeyup.


Should you do this? Of course not. Anywhere you could run these commands, you could instead run git init or git clone, which set up a number of other structures, including .git/config and any unusual permissions options. The key part here is that a directory's identity as "a git repository" is entirely a function of its contents, not of having been blessed into being by git itself.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment