summaryrefslogtreecommitdiff
path: root/doc/tips/setup_a_public_repository_on_a_web_site.mdwn
blob: 39b291218832ad5dacb28d91353ade888691dad6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Let's say you want to distribute some big files to the whole world.
You can of course, just drop them onto a website. But perhaps you'd like to
use git-annex to manage those files. And as an added bonus, why not let
anyone in the world clone your site and use `git-annex get`!

My site like this is [downloads.kitenet.net](https://downloads.kitenet.net).
Here's how I set it up. --[[Joey]]

1. Set up a web site. I used Apache, and configured it to follow symlinks.
   `Options FollowSymLinks`
2. Put some files on the website. Make sure it works.
4. `git init; git annex init`
3. We want users to be able to clone the git repository over http, because
   git-annex can download files from it over http as well. For this to
   work, `git update-server-info` needs to get run after commits. The
   git `post-update` hook will take care of this, you just need to enable
   the hook. `chmod +x .git/hooks/post-update`
5. `git annex add; git commit -m added`
6. Make sure users can still download files from the site directly.
7. Instruct advanced users to clone a http url that ends with the "/.git/"
   directory. For example, for downloads.kitenet.net, the clone url
   is `https://downloads.kitenet.net/.git/`
8. Set up a git `post-receive` hook to update the repository's working tree
   when changes are pushed to it. See below for details.

When users clone over http, and run git-annex, it will
automatically learn all about your repository and be able to download files
right out of it, also using http. 

## post-receive hook

If you have git-annex 4.20130703, the post-receive hook mentioned above
in step 8 just needs to run `git annex merge`.

With older versions of git-annex, you can instead use `git annex sync`.

There are two gotchas with some versions of git to be aware of when writing
this post-receive hook.

1. The hook may be run with the current directory set to the `.git`
   directory, and not the top of your work tree. So you need to `cd ..` or
   similar in the hook.
2. `GIT_DIR` may be set to `.`, which will not be right after changing
   directory. So you will probably want to unset it.

Here's a post-receive hook that takes these problems into account:

<pre>
#!/bin/sh
unset GIT_DIR
cd ..
git annex merge
</pre>