This tutorial shows how to set up a centralized git repository
hosted on your own git server, which can be any unix system with
ssh and git and git-annex installed. A VPS, a home server, etc.

This sets up a very simple git server. More complex setups are possible.
See for example [[using_gitolite_with_git-annex]].

## set up the server

On the server, you'll want to [[install]] git, and git-annex, if you haven't
already. If possible, install it using your distribution's package manager:

	server# sudo apt-get install git git-annex

Note that git-annex-shell needs to be located somewhere in the PATH, so
that a client can successfully run "ssh yourserver git-annex-shell".
Installing git-annex using a package manager will take care of this for
you. But if you're not root or otherwise can't install git-annex that way,
you may need to do more work; see [[get_git-annex-shell_into_PATH]].

Decide where to put the repository on the server, and create a bare git repo
there. In your home directory is a simple choice:

	server# cd
	server# git init annex.git --bare --shared
	server# cd annex.git
	server# git annex init
	init ok

That's the server setup done!

## make a checkout

Now on your laptop, clone the git repository from the server:

	laptop# git clone ssh://example.com/~/annex.git
	Cloning into 'annex'...
	warning: You appear to have cloned an empty repository.
	Checking connectivity... done.

Tell git-annex to use the repository:

	laptop# cd annex
	laptop# git annex init
	init ok

## add files to the repository

Add some files, obtained however.

	# git annex add *.mp4
	add Haskell_Amuse_Bouche-b9OVqxmI.mp4 (checksum) ok
	(Recording state in git...)
	# git commit -m "added a video. I have not watched it yet but it sounds interesting"

Feel free to rename the files, etc, using normal git commands:

	# git mv Haskell_Amuse_Bouche-b9OVqxmI.mp4 Haskell_Amuse_Bouche.mp4
	# git commit -m 'better filenames'

Now push your changes back to the central repository on your server. As
well as pushing the master branch, remember to push the git-annex branch,
which is used to track the file contents.

	# git push origin master git-annex
	To git@github.com:joeyh/techtalks.git
	 * [new branch]      master -> master
	 * [new branch]      git-annex -> git-annex

That push went fast, because it didn't upload large videos to the server.

So, to finish up, tell git-annex to sync all the data in the repository
to your server:

	# git annex sync origin --content
	...

## make more checkouts

So far you have a central repository on your server, and a checkout on a laptop.
Let's make another checkout elsewhere. Clone the central repository as before.

	elsewhere# git clone ssh://example.com/~/annex.git
	elsewhere# cd annex

Notice that your clone does not have the contents of any of the files yet.
If you run `ls`, you'll see broken symlinks. It's easy to download them from
your server either by running `git annex sync --content`, or by asking
git-annex to download individual files:

	# git annex get Haskell_Amuse_Bouche.mp4
	get Haskell_Amuse_Bouche.mp4 (from origin...)
	12877824   2%  255.11kB/s    00:00
	ok
