gmg 0.1.2

git repo command-line manager
# gmg - Super-lightweight git manager

## The idea

The idea is simple: no extra server layer, no extra proxies. Just a pure git
and ssh.

## Setup

The setup scripts are made for Debian/Ubuntu systems

* Launch a blank Debian/Ubuntu container

* gmg requires the system git 2.34 or above. So use either a modern system or
  install the newer git manually.

* Setup ssh server

* Download a gmg binary from the
    [releases]https://github.com/alttch/gmg/releases and put it somewhere
    e.g. to */usr/local/bin/*

* Copy to the container the "share" folder from the repository

* Execute on the container (where org is your organization and org.com is your
organization domain):

```shell
cd share && ./gmg-setup git@org git@org.com
```

and that is it.

The setup creates */git* folder for repositories and configures the global
update hook to protect branches.

## Quick start

### Creating a new repository

```
gmg repo create test -D "My test repo"
```

The repository path can contain groups. E.g. "tests/test". gmg uses repository
names as POSIX groups to manage access, so a full repository name (including
groups) can not be longer than 30 symbols.

### Creating a user

```
gmg user create bob "Bob M" -
```

Copy-paste the public ssh key-file to stdin (or use a file name instead of "-"
argument)

### Granting user access to a repository

```
gmg user grant bob test
```

### Cloning

Repositories can be cloned as

```
git clone ssh://bob@server/git/test
```

Additionally, users get symbolic links created in their homes as soon as access
has been granted:

```
git clone ssh://bob@server:test
```

### Setting user as the maintainer

Maintainers can write to protected branches, for others it is forbidden.

```
gmg maintainer set bob test
```

### Other operations

Type

```
gmg -h
```

for all possible commands.

## Integrating with cgit

gmg automatically generates cgit-compatible configs. The configs are generated
individually for each user, using */etc/cgitrc* as the base one.

* Install cgit and NGINX

```
apt -y install cgit nginx fcgiwrap
```

* Put share/cgit-gmg.cgi into */usr/local/bin/*

* Use the following NGINX config:

```
server {
    listen                80;
    rewrite ^/(.*)/$ https://your-external.domain/$1 permanent;
    rewrite ^/cgit-css/(.*) /$1 last;
    root                  /usr/share/cgit;
    try_files             $uri @cgit;

    auth_pam              "Git";
    auth_pam_service_name "nginx";

    location @cgit {
      include             fastcgi_params;
      fastcgi_param       SCRIPT_FILENAME /usr/local/bin/cgit-gmg.cgi;
      fastcgi_param       PATH_INFO       $uri;
      fastcgi_param       QUERY_STRING    $args;
      fastcgi_param       HTTP_HOST       $server_name;
      fastcgi_pass        unix:/var/run/fcgiwrap.socket;
    }
}
```

* To let users use cgit, they must have system passwords set