Update documentation in preparation of release.
This commit is contained in:
parent
82f5857759
commit
a45445dca0
3 changed files with 216 additions and 17 deletions
149
README.rst
149
README.rst
|
@ -2,24 +2,145 @@
|
||||||
``gitosis`` -- software for hosting ``git`` repositories
|
``gitosis`` -- software for hosting ``git`` repositories
|
||||||
==========================================================
|
==========================================================
|
||||||
|
|
||||||
Example configuration:
|
Manage ``git`` repositories, provide access to them over SSH,
|
||||||
|
with tight access control and not needing shell accounts.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Documentation is still lacking, and non-default configurations
|
||||||
|
(e.g. config file, repositories, installing in a location that
|
||||||
|
is not in ``PATH``) basically have not been tested at all.
|
||||||
|
Basic usage should be very reliable -- the project has been
|
||||||
|
hosting itself for a long time. Any help is welcome.
|
||||||
|
|
||||||
|
``gitosis`` aims to make hosting ``git`` repos easier and safer. It
|
||||||
|
manages multiple repositories under one user account, using SSH keys
|
||||||
|
to identify users. End users do not need shell accounts on the server,
|
||||||
|
they will talk to one shared account that will not let them run
|
||||||
|
arbitrary commands.
|
||||||
|
|
||||||
|
``gitosis`` is licensed under the GPL, see the file ``COPYING`` for
|
||||||
|
more information.
|
||||||
|
|
||||||
|
You can get ``gitosis`` via ``git`` by saying::
|
||||||
|
|
||||||
|
git clone git://eagain.net/gitosis
|
||||||
|
|
||||||
|
And install it via::
|
||||||
|
|
||||||
|
python setup.py install
|
||||||
|
|
||||||
|
Though you may want to use e.g. ``--prefix=``. For Debian/Ubuntu
|
||||||
|
users, the source is debianized.
|
||||||
|
|
||||||
|
|
||||||
|
Setting up
|
||||||
|
==========
|
||||||
|
|
||||||
|
First, we will create the user that will own the repositories. This is
|
||||||
|
usually called ``git``, but any name will work, and you can have more
|
||||||
|
than one per system if you really want to. The user does not need a
|
||||||
|
password, but does need a valid shell (otherwise, SSH will refuse to
|
||||||
|
work).
|
||||||
|
|
||||||
|
I usually store ``git`` repositories in the subtree
|
||||||
|
``/srv/example.com/git`` (replace ``example.com`` with your own
|
||||||
|
domain). You may choose another location. Adjust to suit and run::
|
||||||
|
|
||||||
|
sudo adduser \
|
||||||
|
--system \
|
||||||
|
--no-create-home \
|
||||||
|
--shell /bin/sh \
|
||||||
|
--gecos 'git version control' \
|
||||||
|
--group \
|
||||||
|
--disabled-password \
|
||||||
|
--home /srv/example.com/git \
|
||||||
|
git
|
||||||
|
|
||||||
|
This command is known to work in Debian and Ubuntu. Your mileage may
|
||||||
|
vary.
|
||||||
|
|
||||||
|
You will need an SSH public key to continue. If you don't have one,
|
||||||
|
you need to generate one. See the man page for ``ssh-keygen``, and you
|
||||||
|
may also be interested in ``ssh-agent``. Create it on your personal
|
||||||
|
computer, and protect the *private* key well -- that includes not
|
||||||
|
transferring it over the network.
|
||||||
|
|
||||||
|
Next, we need to set things up for this newly-created user. The
|
||||||
|
following command will create a ``~/repositories`` that will hold the
|
||||||
|
``git`` repositories, a ``~/.gitosis.conf`` that will be a symlink to
|
||||||
|
the actual configuration file, and it will add the SSH public key to
|
||||||
|
``~/.ssh/authorized_keys`` with a ``command=`` option that restricts
|
||||||
|
it to running ``gitosis-serve``. Run::
|
||||||
|
|
||||||
|
sudo -H -u git gitosis-init <FILENAME.pub
|
||||||
|
# (or just copy-paste the public key when prompted)
|
||||||
|
|
||||||
|
then just ``git clone git@SERVER:gitosis-admin.git``, and you get a
|
||||||
|
repository with SSH keys as ``keys/USER.pub`` and a ``gitosis.conf``
|
||||||
|
where you can configure who has access to what.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
For now, ``gitosis`` uses the ``HOME`` environment variable to
|
||||||
|
locate where to write its files. If you use ``sudo -u``
|
||||||
|
without ``-H``, ``sudo`` will leave the old value of ``HOME``
|
||||||
|
in place, and this will cause trouble. There will be a
|
||||||
|
workaround for that later on, but for now, always remember to
|
||||||
|
use ``-H`` if you're sudoing to the account.
|
||||||
|
|
||||||
|
You should always edit the configuration file via ``git``. The file
|
||||||
|
symlinked to ``~/.gitosis.conf`` on the server will be overwritten
|
||||||
|
when pushing changes to the ``gitosis-admin.git`` repository.
|
||||||
|
|
||||||
|
Edit the settings as you wish, commit and push. That's pretty much it!
|
||||||
|
Once you push, ``gitosis`` will immediately make your changes take
|
||||||
|
effect on the server.
|
||||||
|
|
||||||
|
|
||||||
|
Managing it
|
||||||
|
===========
|
||||||
|
|
||||||
|
To add new users:
|
||||||
|
|
||||||
|
- add a ``keys/USER.pub`` file
|
||||||
|
- authorize them to read/write repositories as needed (or just
|
||||||
|
authorize the group ``@all``)
|
||||||
|
|
||||||
|
To create new repositories, just authorize writing to them and
|
||||||
|
push. It's that simple! For example: let's assume your username is
|
||||||
|
``jdoe`` and you want to create a repository ``myproject``.
|
||||||
|
In your clone of ``gitosis-admin``, edit ``gitosis.conf`` and add::
|
||||||
|
|
||||||
|
[group myteam]
|
||||||
|
members = jdoe
|
||||||
|
writable = myproject
|
||||||
|
|
||||||
|
Commit that change and push. Then create the initial commit and push
|
||||||
|
it::
|
||||||
|
|
||||||
|
mkdir myproject
|
||||||
|
git init
|
||||||
|
git remote add myserver git@MYSERVER:myproject.git
|
||||||
|
# do some work, git add and commit files
|
||||||
|
git push myserver master:master
|
||||||
|
|
||||||
|
That's it. If you now add others to ``members``, they can use that
|
||||||
|
repository too.
|
||||||
|
|
||||||
|
|
||||||
|
Example configuration
|
||||||
|
=====================
|
||||||
|
|
||||||
.. include:: example.conf
|
.. include:: example.conf
|
||||||
:literal:
|
:literal:
|
||||||
|
|
||||||
TODO
|
|
||||||
====
|
|
||||||
|
|
||||||
gitosis-lint: check that the user account (e.g. ``git``) looks valid
|
Contact
|
||||||
|
=======
|
||||||
|
|
||||||
gitosis-init: create repo with conf+keydir
|
You can email the author at ``tv@eagain.net``, or hop on
|
||||||
|
``irc.freenode.net`` channel ``#git`` and hope for the best.
|
||||||
gitosis-create-repositories: create repos mentioned in config if
|
|
||||||
they don't exist
|
|
||||||
|
|
||||||
make git hook: update authorized_keys
|
|
||||||
|
|
||||||
make git hook: update config file
|
|
||||||
|
|
||||||
git-daemon-export-ok
|
|
||||||
|
|
||||||
|
There will be more, keep an eye on http://eagain.net/ and/or the git
|
||||||
|
mailing list.
|
||||||
|
|
48
TODO.rst
48
TODO.rst
|
@ -2,6 +2,15 @@
|
||||||
TODO list
|
TODO list
|
||||||
===========
|
===========
|
||||||
|
|
||||||
|
- let me have ~git{,/repositories} owned by root:root
|
||||||
|
|
||||||
|
- gitosis-lint: check that the user account (e.g. ``git``) looks valid
|
||||||
|
|
||||||
|
- gitosis-create-repositories: create repos mentioned in config if
|
||||||
|
they don't exist
|
||||||
|
|
||||||
|
- git-daemon-export-ok
|
||||||
|
|
||||||
- guard against *.pub files named -foo.pub or foo;bar.pub
|
- guard against *.pub files named -foo.pub or foo;bar.pub
|
||||||
|
|
||||||
- gitweb doesn't understand mappings, just visible/no,
|
- gitweb doesn't understand mappings, just visible/no,
|
||||||
|
@ -9,10 +18,49 @@
|
||||||
|
|
||||||
- maybe remove the whole mapping feature for good?
|
- maybe remove the whole mapping feature for good?
|
||||||
|
|
||||||
|
- maybe create symlink trees to make mappings visible in filesystem?
|
||||||
|
|
||||||
- use groups somehow to reduce typing for ``gitweb = yes``
|
- use groups somehow to reduce typing for ``gitweb = yes``
|
||||||
|
|
||||||
- detect when repo actually ends in ``.git`` for ``projects.list``
|
- detect when repo actually ends in ``.git`` for ``projects.list``
|
||||||
(otherwise gitweb won't see it)
|
(otherwise gitweb won't see it)
|
||||||
|
|
||||||
|
- unit test projects.list generation in run-hook
|
||||||
|
|
||||||
- ConfigParser does not guarantee ordering, rewrite all unit tests to
|
- ConfigParser does not guarantee ordering, rewrite all unit tests to
|
||||||
assume sorted, fix code to sort
|
assume sorted, fix code to sort
|
||||||
|
|
||||||
|
- test with ssh://
|
||||||
|
|
||||||
|
- write description to a file, make REPO.git/description symlink to it
|
||||||
|
if it doesn't exist (thus not overwriting local changes)
|
||||||
|
|
||||||
|
- gitweb knows about cloneurl, handle like description
|
||||||
|
|
||||||
|
- gitweb knows about README.html, figure out how to generate from e.g.
|
||||||
|
README.rst in gitosis.git
|
||||||
|
|
||||||
|
- make gitosis-gitweb output a gitweb.conf file too
|
||||||
|
|
||||||
|
- need to chgrp repositories www-data to make them accessible by gitweb
|
||||||
|
|
||||||
|
- allow using git-cvsserver?
|
||||||
|
|
||||||
|
- move from log.foo("bar" % quux) to log.foo("bar", quux)
|
||||||
|
|
||||||
|
- can't trust "~"::
|
||||||
|
|
||||||
|
[0 tv@musti ~]$ sudo python -c 'import os; print os.path.expanduser("~")'
|
||||||
|
/home/tv
|
||||||
|
[0 tv@musti ~]$ sudo -H python -c 'import os; print os.path.expanduser("~")'
|
||||||
|
/root
|
||||||
|
|
||||||
|
- command line options
|
||||||
|
|
||||||
|
- gitosis init --repositories=
|
||||||
|
- gitosis init --config= (or whatever the option is elsewhere)
|
||||||
|
- gitosis init --home= (for testing)
|
||||||
|
- gitosis init --admin=username[@host]
|
||||||
|
|
||||||
|
- gitosis-run-hook has to be in PATH and PYTHONPATH before you can
|
||||||
|
push to gitosis-admin.git
|
||||||
|
|
36
example.conf
36
example.conf
|
@ -1,20 +1,50 @@
|
||||||
|
# this config file tries to show a bit of everything, most real life
|
||||||
|
# configurations really only need a "group" section with "members" and
|
||||||
|
# "writable"
|
||||||
|
|
||||||
[gitosis]
|
[gitosis]
|
||||||
repositories = repo
|
## To override the default ~/repositories path
|
||||||
|
# repositories = repositories
|
||||||
|
|
||||||
|
## Allow gitweb to show all known repositories. If you want gitweb,
|
||||||
|
## you need either this or a [repo foo] section for each repository
|
||||||
|
## you want visible in gitweb.
|
||||||
gitweb = no
|
gitweb = no
|
||||||
|
|
||||||
|
## Allow git-daemon to publish all known repositories. As with gitweb,
|
||||||
|
## this can be done globally or per-repository.
|
||||||
|
## NOT YET IMPLEMENTED.
|
||||||
# daemon-ok = no
|
# daemon-ok = no
|
||||||
|
|
||||||
|
## Logging level, one of DEBUG, INFO, WARNING, ERROR, CRITICAL
|
||||||
|
loglevel = DEBUG
|
||||||
|
|
||||||
[group quux]
|
[group quux]
|
||||||
members = jdoe wsmith @anothergroup
|
members = jdoe wsmith @anothergroup
|
||||||
writable = foo bar baz/thud
|
writable = foo bar baz/thud
|
||||||
readonly = xyzzy
|
readonly = xyzzy
|
||||||
|
|
||||||
|
## You can play fancy tricks by making some repositories appear with
|
||||||
|
## different names in different contexts. Not really supported
|
||||||
|
## everywhere (e.g. gitweb) and can be confusing -- experts only.
|
||||||
map writable visiblename1 = actualname1
|
map writable visiblename1 = actualname1
|
||||||
map readonly visiblename2 = actualname2
|
map readonly visiblename2 = actualname2
|
||||||
|
|
||||||
[repo foo]
|
[repo foo]
|
||||||
# description = blah blah
|
## Allow gitweb to show this repository.
|
||||||
gitweb = yes
|
gitweb = yes
|
||||||
|
|
||||||
|
## Oneline description of the project, mostly for gitweb.
|
||||||
|
## NOT YET IMPLEMENTED.
|
||||||
|
# description = blah blah
|
||||||
|
## Owner of this repository. Used in gitweb list of projects.
|
||||||
owner = John Doe
|
owner = John Doe
|
||||||
|
|
||||||
|
## Allow git-daemon to publish this repository.
|
||||||
|
## NOT YET IMPLEMENTED.
|
||||||
# daemon-ok = no
|
# daemon-ok = no
|
||||||
|
|
||||||
# [gitweb]
|
[gitweb]
|
||||||
|
## Where to make gitweb link to as it's "home location".
|
||||||
|
## NOT YET IMPLEMENTED.
|
||||||
# homelink = http://example.com/
|
# homelink = http://example.com/
|
||||||
|
|
Loading…
Reference in a new issue