# 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