diff options
| author | Owen Jacobson <owen.jacobson@grimoire.ca> | 2013-02-06 12:06:38 -0500 |
|---|---|---|
| committer | Owen Jacobson <owen.jacobson@grimoire.ca> | 2013-02-06 12:06:38 -0500 |
| commit | 65a9bc0ff9bff6f29035eeaa464fda0c86770724 (patch) | |
| tree | 0f303009ab9166271f95f079954fd1f794991e6a /wiki | |
| parent | eeeba8c21b8a06ec48c3c8cbd0e3926f378fe3bd (diff) | |
A quickie on demystifying part of how git works.
(No, it's not useful.)
Diffstat (limited to 'wiki')
| -rw-r--r-- | wiki/git/scratch.md | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/wiki/git/scratch.md b/wiki/git/scratch.md new file mode 100644 index 0000000..f920c77 --- /dev/null +++ b/wiki/git/scratch.md @@ -0,0 +1,56 @@ +# Git Is Not Magic + +I'm bored. 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`](http://jk.gs/git-symbolic-ref.html)) named `HEAD``, +pointing to the currently checked-out branch. Let's use `master`. Branches are +refs under `refs/heads` (see [`man +git-branch`](http://jk.gs/git-branch.html)): + + 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`](http://jk.gs/gitrepository-layout.html) and [`man +gitrevisions`](http://jk.gs/gitrevisions.html)). 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 <owen.jacobson@grimoire.ca> + Date: Wed Feb 6 10:07:07 2013 -0500 + + Initial commit + +[Eeyup](https://www.youtube.com/watch?v=3VwVpaWUu30). + +----- + +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. + +You can infer a lot from this: for example, you can infer that it's "safe" to +move git repositories around using FS tools, or to back them up with the same +tools, for example. This is not as obvious to everyone as you might hope; people |
