arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
415 lines (295 loc) • 12.3 kB
Markdown
[Cgit](http://git.zx2c4.com/cgit/) is an attempt to create a fast web interface for the [git](/index.php/Git "Git") version control system, using a built in cache to decrease pressure on the git server.
## Contents
* [1 Installation](#Installation)
* [2 Configuration of web server](#Configuration_of_web_server)
* [2.1 Apache](#Apache)
* [2.2 Lighttpd](#Lighttpd)
* [2.2.1 Lighttpd sub-domain](#Lighttpd_sub-domain)
* [2.3 Nginx](#Nginx)
* [2.3.1 Using fcgiwrap](#Using_fcgiwrap)
* [2.3.2 Using uwsgi](#Using_uwsgi)
* [2.4 Caddy](#Caddy)
* [3 Configuration of cgit](#Configuration_of_cgit)
* [3.1 Basic configuration](#Basic_configuration)
* [3.2 Adding repositories](#Adding_repositories)
* [3.3 Syntax highlighting](#Syntax_highlighting)
* [3.3.1 Using python-pygments](#Using_python-pygments)
* [3.3.2 Using highlight](#Using_highlight)
* [4 Integration](#Integration)
* [4.1 Gitosis](#Gitosis)
* [4.2 Gitolite](#Gitolite)
* [5 Troubleshooting](#Troubleshooting)
* [5.1 *snapshots* does not show properly](#snapshots_does_not_show_properly)
* [5.2 *source-filter* does not work properly](#source-filter_does_not_work_properly)
* [6 References](#References)
## Installation
Install the [cgit](https://www.archlinux.org/packages/?name=cgit) package.
To use cgit a [web server](/index.php/Web_server "Web server") must be installed on the system, such as [Apache](/index.php/Apache "Apache").
## Configuration of web server
### Apache
You may add the following either to the end of your `/etc/httpd/conf/httpd.conf` file or place it in a separate file inside the `/etc/httpd/conf/extra/` directory.
```
ScriptAlias /cgit "/usr/lib/cgit/cgit.cgi/"
Alias /cgit-css "/usr/share/webapps/cgit/"
<Directory "/usr/share/webapps/cgit/">
AllowOverride None
Options None
Require all granted
</Directory>
<Directory "/usr/lib/cgit/">
AllowOverride None
Options ExecCGI FollowSymlinks
Require all granted
</Directory>
```
Make sure that the cgi module is being loaded in the `httpd.conf` by uncommenting this line:
```
LoadModule cgi_module modules/mod_cgi.so
```
and restart `httpd.service` to apply the changes.
### Lighttpd
The following configuration will let you access cgit through [http://your.server.com/git](http://your.server.com/git) or [http://your.server.com/cgit](http://your.server.com/cgit). The cgit url is not perfect (for example you will see "cgit.cgi" in all repos' url) but works.
Create the file `/etc/lighttpd/conf.d/cgit.conf`:
```
server.modules += ( "mod_cgi", "mod_alias" )
$HTTP["url"] =~ "^/cgit" {
server.document-root = "/usr/share/webapps/"
server.indexfiles = ("cgit.cgi")
cgi.assign = ("cgit.cgi" => "")
mimetype.assign = ( ".css" => "text/css" )
}
alias.url += (
"/git" => "/usr/share/webapps/cgit/cgit.cgi",
)
$HTTP["url"] =~ "^/git" {
cgi.assign = ( "" => "" )
}
```
And include this file in `/etc/lighttpd/lighttpd.conf`:
```
include "conf.d/cgit.conf"
```
and restart lighttpd.
#### Lighttpd sub-domain
This alternative lighttpd configuration will serve Cgit on a sub-domain like git.example.com with optional SSL support, and rewrites creating nice permalinks:
```
server.modules += ( "mod_cgi", "mod_rewrite" )
#$SERVER["socket"] == ":443" {
$SERVER["socket"] == ":80" {
#ssl.engine = "enable"
#ssl.pemfile = "/etc/lighttpd/ssl/git.example.com.pem"
server.name = "git.example.com"
server.document-root = "/usr/share/webapps/cgit/"
index-file.names = ( "cgit.cgi" )
cgi.assign = ( "cgit.cgi" => "" )
url.rewrite-once = (
"^/([^?/]+/[^?]*)?(?:\?(.*))?$" => "/cgit.cgi?url=$1&$2",
)
}
```
### Nginx
#### Using fcgiwrap
The following configuration uses [fcgiwrap](https://www.archlinux.org/packages/?name=fcgiwrap) and will serve Cgit on a subdomain like `git.example.com`.
[Start](/index.php/Start "Start") and [enable](/index.php/Enable "Enable") `fcgiwrap.socket`. Then, configure Nginx:
`/etc/nginx/nginx.conf`
```
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
# Cgit
server {
listen 80;
server_name *git.example.com;*
root /usr/share/webapps/cgit;
try_files $uri @cgit;
location @cgit {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/cgit.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param QUERY_STRING $args;
fastcgi_param HTTP_HOST $server_name;
fastcgi_pass unix:/run/fcgiwrap.sock;
}
}
}
```
#### Using uwsgi
The following example will setup cgit using the native cgi plugin for uwsgi.
First, install [uwsgi](https://www.archlinux.org/packages/?name=uwsgi) and [uwsgi-plugin-cgi](https://www.archlinux.org/packages/?name=uwsgi-plugin-cgi).
Add below server block to your configuration:
`/etc/nginx/nginx.conf`
```
server {
listen 80;
server_name git.example.com;
root /usr/share/webapps/cgit;
# Serve static files with nginx
location ~* ^.+(cgit.(css|png)|favicon.ico|robots.txt) {
root /usr/share/webapps/cgit;
expires 30d;
}
location / {
try_files $uri @cgit;
}
location @cgit {
gzip off;
include uwsgi_params;
uwsgi_modifier1 9;
uwsgi_pass unix:/run/uwsgi/cgit.sock;
}
}
```
Add a uwsgi configuration for cgit.
`/etc/uwsgi/cgit.ini`
```
[uwsgi]
master = true
plugins = cgi
socket = /run/uwsgi/%n.sock
uid = http
gid = http
procname-master = uwsgi cgit
processes = 1
threads = 2
cgi = /usr/lib/cgit/cgit.cgi
```
[Enable](/index.php/Enable "Enable") and [start](/index.php/Start "Start") the corresponding socket `uwsgi@cgit.socket`.
### Caddy
Install [Caddy](/index.php/Caddy "Caddy") with the [caddy-cgi](https://jung-kurt.github.io/cgi/) plugin, for example [caddy-with-cgi](https://aur.archlinux.org/packages/caddy-with-cgi/). The following configuration uses the `except` subdirective in the latest caddy-cgi plugin.
`/etc/caddy/caddy.conf.d/cgit.conf`
```
git.example.com {
# other settings such as TLS, headers, ...
root /usr/share/webapps/cgit
cgi {
match /
exec /usr/share/webapps/cgit/cgit.cgi
except /cgit.png /favicon.ico /cgit.css /robots.txt
}
}
```
## Configuration of cgit
See [cgitrc(5)](https://jlk.fjfi.cvut.cz/arch/manpages/man/cgitrc.5) for the list of all config options.
### Basic configuration
Before you can start adding repositories you will first have to create the basic cgit configuration file at `/etc/cgitrc`.
```
#
# cgit config
#
css=/cgit.css
logo=/cgit.png
# Following lines work with the above Apache config
#css=/cgit-css/cgit.css
#logo=/cgit-css/cgit.png
# Following lines work with the above Lighttpd config
#css=/cgit/cgit.css
#logo=/cgit/cgit.png
# Allow http transport git clone
#enable-http-clone=0
# if you do not want that webcrawler (like google) index your site
robots=noindex, nofollow
# if cgit messes up links, use a virtual-root. For example has cgit.example.org/ this value:
virtual-root=/
```
### Adding repositories
Now you can add your repos:
```
#
# List of repositories.
# This list could be kept in a different file (e.g. '/etc/cgitrepos')
# and included like this:
# include=/etc/cgitrepos
#
repo.url=MyRepo
repo.path=/srv/git/MyRepo.git
repo.desc=This is my git repository
# For a non-bare repository
repo.url=MyOtherRepo
repo.path=/srv/git/MyOtherRepo/.git
repo.desc=That's my other git repository
```
Or else, it is also possible to configure cgit to automatically search for the repo:
```
scan-path=/srv/git/
```
If you use the method above, add the descriptions to `.git/description` file and add the following lines to show the author:
`.git/config`
```
[gitweb]
owner = John Cena <john@riseup.net>
```
If you are coming from gitweb and want to keep the descriptions and owner information, then use:
```
enable-git-config=1
```
For detailed documentation about the available settings in this configuration file, please see the manpage ([cgitrc(5)](https://jlk.fjfi.cvut.cz/arch/manpages/man/cgitrc.5)).
### Syntax highlighting
Cgit supports syntax highlighting when viewing blobs. To enable syntax highlighting, you have several options.
#### Using python-pygments
Install [python-pygments](https://www.archlinux.org/packages/?name=python-pygments) and add the filter in `/etc/cgitrc`
```
source-filter=/usr/lib/cgit/filters/syntax-highlighting.py
```
To change the coloring style, modify the `style` argument that is passed to `HtmlFormatter` in the `syntax-highlighting.py` file. For instance, to change the coloring style to 'tango':
```
formatter = HtmlFormatter(encoding='utf-8', style='tango')
```
To get a list of all coloring styles that are available, do:
```
$ python
>>> from pygments.styles import get_all_styles
>>> list(get_all_styles())
['manni', 'igor', 'xcode', 'vim', 'autumn', 'vs', 'rrt', 'native', 'perldoc', 'borland', 'tango', 'emacs', 'friendly', 'monokai', 'paraiso-dark', 'colorful', 'murphy', 'bw', 'pastie', 'paraiso-light', 'trac', 'default', 'fruity']
```
#### Using highlight
Install the [highlight](https://www.archlinux.org/packages/?name=highlight) package.
Copy `/usr/lib/cgit/filters/syntax-highlighting.sh` to `/usr/lib/cgit/filters/syntax-highlighting-edited.sh`. Then, in the copied file, comment out version 2 and comment in version 3. You may want to add `--inline-css` to the options of highlight for a more colorful output without editing cgit's css file.
```
# This is for version 2
#exec highlight --force -f -I -X -S "$EXTENSION" 2>/dev/null
# This is for version 3
exec highlight --force --inline-css -f -I -O xhtml -S "$EXTENSION" 2>/dev/null
```
Enable the filter in `/etc/cgitrc`
```
source-filter=/usr/lib/cgit/filters/syntax-highlighting-edited.sh
```
**Note:** Editing `/usr/lib/cgit/filters/syntax-highlighting.sh` directly would lose all the modifications as soon as [cgit](https://www.archlinux.org/packages/?name=cgit) is updated.
## Integration
### Gitosis
If you want to integrate with [gitosis](/index.php/Gitosis "Gitosis") you will have to run two commands to give apache permission to look though the folder.
```
# chgrp http /srv/gitosis
# chmod a+rx /srv/gitosis
```
### Gitolite
If you added repositories managed by [gitolite](/index.php/Gitolite "Gitolite") you have to change the permissions, so the web server can access the files.
* Add the *http* user to the *gitolite* group:
* `# usermod -aG gitolite http`
* Change permission for future repositories:
* Edit `/var/lib/gitolite/.gitolite.rc`. Change the `UMASK` to `0027`
* See also: [http://gitolite.com/gitolite/gitolite.html#umask](http://gitolite.com/gitolite/gitolite.html#umask)
* Change permission for the *gitolite* home directory, and existing repositories. Run the following two commands:
* `# chmod g+rX /var/lib/gitolite`
* `# chmod -R g+rX /var/lib/gitolite/repositories`
## Troubleshooting
### *snapshots* does not show properly
If you have enabled *scan-path* as well as *snapshots*, the order in cgitrc matters. According to [cgit mailing list](http://comments.gmane.org/gmane.comp.version-control.cgit/917), *snapshots* should be specified before *scan-path*
```
snapshots=tar.gz tar.bz2 zip
scan-path=/path/to/your/repositories
```
### *source-filter* does not work properly
If you have enabled *scan-path*, again, the order in cgitrc matters. *source-filter* should be specified before *scan-path*, otherwise it will have no effect.
## References
* [https://git.zx2c4.com/cgit/](https://git.zx2c4.com/cgit/)
* [https://git.zx2c4.com/cgit/about/](https://git.zx2c4.com/cgit/about/)
* [https://git.zx2c4.com/cgit/tree/README](https://git.zx2c4.com/cgit/tree/README)
* [https://git.zx2c4.com/cgit/tree/cgitrc.5.txt](https://git.zx2c4.com/cgit/tree/cgitrc.5.txt)