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.