documentation updates for new receive.denyCurrentBranch=updateInstead support

This commit was sponsored by andrea rota.
This commit is contained in:
Joey Hess 2017-02-17 15:43:16 -04:00
parent e6857e75a6
commit a700fdf5cf
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
9 changed files with 59 additions and 45 deletions

View file

@ -0,0 +1,24 @@
Normally, pushing a change into a remote git repository does not update its
working tree. But it can be very convenient to only need to `git push`
(or `git annex sync --content`) to a remote to update the files checked out
there.
Git has a way to let you do this, by setting `receive.denyCurrentBranch`
to `updateInstead` in the remote repository. For example:
ssh remote
cd /path/to/repo
git config receive.denyCurrentBranch updateInstead
Now after a push to the remote, its working tree will be updated.
Changes in the remote's working tree can prevent this update from working;
normally you'll want to avoid manually changing the remote's working tree,
and only push changes into it in this configuration.
When the remote is using [[direct_mode]] or
[[adjusted_branches|git-annex-adjust]], you need the git-annex post-receive
hook to be set up for pushes to update the remote's working tree.
This is a new feature in git-annex 6.20170217. If the remote was
initialized with an older version of git-annex, you will need to re-run
`git annex init` in the remote after upgrading git-annex.

View file

@ -12,44 +12,19 @@ Here's how I set it up. --[[Joey]]
3. `git init; git annex init`
4. `git config core.sharedrepository world` (Makes sure files
are always added with permissions that allow everyone to read them.)
5. We want users to be able to clone the git repository over http, because
5. `git config receive.denyCurrentBranch updateInstead` (Makes the
[[working tree update when changes are pushed to it|making_a_remote_repo_update_when_changes_are_pushed_to_it]].)
6. 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`
6. `git annex add; git commit -m added`
7. Make sure users can still download files from the site directly.
8. Instruct advanced users to clone a http url that ends with the "/.git/"
7. `git annex add; git commit -m added`
8. Make sure users can still download files from the site directly.
9. 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/`
9. 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 9 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>

View file

@ -1,10 +0,0 @@
[[!comment format=mdwn
username="wsha.code+ga@b38779424f41c5701bbe5937340be43ff1474b2d"
nickname="wsha.code+ga"
subject="post-receive hook"
date="2015-10-09T17:41:51Z"
content="""
The post is pretty clear but I misinterpreted at first and got stuck for a while, so just in case this helps anyone else:
The issues about the `post-receive` hook running in the `.git` directory and `GIT_DIR` being set to `.` are distinct issues and you might need to fix both them. At first, I thought they were the same thing and just doing `cd ..` would be enough to fix things, but it is not.
"""]]