git repository layout
=====================

You may find these things in your git repository (`.git`
directory for a repository associated with your working tree, or
`'project'.git` directory for a public 'bare' repository).

objects::
	Object store associated with this repository.  Usually
	an object store is self sufficient (i.e. all the objects
	that are referred to by an object found in it are also
	found in it), but there are couple of ways to violate
	it.
+
. You could populate the repository by running a commit walker
without `-a` option.  Depending on which options are given, you
could have only commit objects without associated blobs and
trees this way, for example.  A repository with this kind of
incomplete object store is not suitable to be published to the
outside world but sometimes useful for private repository.
. You can be using `objects/info/alternates` mechanism, or
`$GIT_ALTERNATE_OBJECT_DIRECTORIES` mechanism to 'borrow'
objects from other object stores.  A repository with this kind
of incomplete object store is not suitable to be published for
use with dumb transports but otherwise is OK as long as
`objects/info/alternates` points at the right object stores
it borrows from.

objects/[0-9a-f][0-9a-f]::
	Traditionally, each object is stored in its own file.
	They are split into 256 subdirectories using the first
	two letters from its object name to keep the number of
	directory entries `objects` directory itself needs to
	hold.  Objects found here are often called 'unpacked'
	objects.

objects/pack::
	Packs (files that store many object in compressed form,
	along with index files to allow them to be randomly
	accessed) are found in this directory.

objects/info::
	Additional information about the object store is
	recorded in this directory.

objects/info/packs::
	This file is to help dumb transports discover what packs
	are available in this object store.  Whenever a pack is
	added or removed, `git update-server-info` should be run
	to keep this file up-to-date if the repository is
	published for dumb transports.  `git repack` does this
	by default.

objects/info/alternates::
	This file records absolute filesystem paths of alternate
	object stores that this object store borrows objects
	from, one pathname per line.

refs::
	References are stored in subdirectories of this
	directory.  The `git prune` command knows to keep
	objects reachable from refs found in this directory and
	its subdirectories.

refs/heads/`name`::
	records tip-of-the-tree commit objects of branch `name`

refs/tags/`name`::
	records any object name (not necessarily a commit
	object, or a tag object that points at a commit object).

HEAD::
	A symlink of the form `refs/heads/'name'` to point at
	the current branch, if exists.  It does not mean much if
	the repository is not associated with any working tree
	(i.e. a 'bare' repository), but a valid git repository
	*must* have such a symlink here.  It is legal if the
	named branch 'name' does not (yet) exist.

branches::
	A slightly deprecated way to store shorthands to be used
	to specify URL to `git fetch`, `git pull` and `git push`
	commands is to store a file in `branches/'name'` and
	give 'name' to these commands in place of 'repository'
	argument.

hooks::
	Hooks are customization scripts used by various git
	commands.  A handful of sample hooks are installed when
	`git init-db` is run, but all of them are disabled by
	default.  To enable, they need to be made executable.

index::
	The current index file for the repository.  It is
	usually not found in a bare repository.

info::
	Additional information about the repository is recorded
	in this directory.

info/refs::
	This file is to help dumb transports to discover what
	refs are available in this repository.  Whenever you
	create/delete a new branch or a new tag, `git
	update-server-info` should be run to keep this file
	up-to-date if the repository is published for dumb
	transports.  The `git-receive-pack` command, which is
	run on a remote repository when you `git push` into it,
	runs `hooks/update` hook to help you achieve this.

info/grafts::
	This file records fake commit ancestry information, to
	pretend the set of parents a commit has is different
	from how the commit was actually created.  One record
	per line describes a commit and its fake parents by
	listing their 40-byte hexadecimal object names separated
	by a space and terminated by a newline.

info/exclude::
	This file, by convention among Porcelains, stores the
	exclude pattern list.  `git status` looks at it, but
	otherwise it is not looked at by any of the core git
	commands.

remotes::
	Stores shorthands to be used to give URL and default
	refnames to interact with remote repository to `git
	fetch`, `git pull` and `git push` commands.
