cgit
cgit 旨在为 git 版本控制系统创建一个快速的 Web 界面,使用内置缓存来减少 git 服务器的压力。
安装
安装 cgit 软件包。
要使用 cgit,必须在系统上安装和配置 web 服务器。
Web 服务器配置
Apache
将以下内容添加到 /etc/httpd/conf/httpd.conf 的末尾
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>
或者,也可以将其添加到单独的文件中,例如 etc/httpd/conf/extra/cgit.conf,然后将以下内容添加到 httpd.conf 的末尾
# cgit configuration Include conf/extra/cgit.conf
这允许您通过 your.server.com/cgit 访问 cgit。确保 Apache 配置为允许 CGI 执行,方法是在 httpd.conf 中取消注释以下内容
<IfModule !mpm_prefork_module> LoadModule cgid_module modules/mod_cgid.so </IfModule> <IfModule mpm_prefork_module> LoadModule cgi_module modules/mod_cgi.so </IfModule>
然后 重启 httpd.service 以应用这些更改。有关使用 Apache 执行 CGI 的更多详细信息,请参阅 https://httpd.apache.ac.cn/docs/2.4/howto/cgi.html。
Lighttpd
以下配置将允许您通过 http://your.server.com/git 或 http://your.server.com/cgit 访问 cgit。cgit url 并不完美(例如,您将在所有仓库的 url 中看到“cgit.cgi”),但可以工作。
创建文件 /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 = ( "" => "" )
}
并将此文件包含在 /etc/lighttpd/lighttpd.conf 中
include "conf.d/cgit.conf"
然后 重启 lighttpd.service。
Lighttpd 子域名
此 Lighttpd 替代配置将在子域名(如 git.example.com)上提供 cgit,并具有可选的 SSL 支持,以及创建美观永久链接的重写规则
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" => "" )
mimetype.assign = ( ".css" => "text/css" )
url.rewrite-once = (
"^/cgit/cgit.css" => "/cgit.css",
"^/cgit/cgit.png" => "/cgit.png",
"^/([^?/]+/[^?]*)?(?:\?(.*))?$" => "/cgit.cgi?url=$1&$2",
)
}
Nginx
使用 fcgiwrap
以下配置使用 fcgiwrap,将在子域名(如 git.example.com)上提供 cgit。
启动 并 启用 fcgiwrap.socket。然后,配置 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;
# Configure HTTP transport
location ~ /.+/(info/refs|git-upload-pack) {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param PATH_INFO $uri;
fastcgi_param GIT_HTTP_EXPORT_ALL 1;
fastcgi_param GIT_PROJECT_ROOT /srv/git;
fastcgi_param HOME /srv/git;
fastcgi_pass unix:/run/fcgiwrap.sock;
}
location @cgit {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param QUERY_STRING $args;
fastcgi_param HTTP_HOST $server_name;
fastcgi_pass unix:/run/fcgiwrap.sock;
}
}
}
使用 uwsgi
以下示例将使用 uwsgi 的原生 cgi 插件设置 cgit。
首先,安装 uwsgi 和 uwsgi-plugin-cgi。
将以下服务器块添加到您的配置中
/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;
}
}
为 cgit 添加 uwsgi 配置。
/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
启用 并 启动 相应的 socket uwsgi@cgit.socket。
Caddy
以下配置使用 fcgiwrap,将在子域名(如 git.example.com)上提供 cgit。
启动 并 启用 fcgiwrap.socket。然后,配置 Caddy
/etc/caddy/conf.d/cgit
git.example.com
@assets path /cgit.css /cgit.js /cgit.png /favicon.ico /robots.txt
handle @assets {
root * /usr/share/webapps/cgit
file_server
}
reverse_proxy unix//run/fcgiwrap.sock {
transport fastcgi {
env SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi
}
}
h2o
软件包 h2o-gitAUR 有其自己的 CGI 包装器 fastcgi-cgi,它通过以下配置支持 cgit。
/etc/h2o/h2o.conf
"git.domain.tld:443":
listen:
port: 443
ssl:
...
paths:
/cgit.css:
file.file: /usr/share/webapps/cgit/cgit.css
file.send-compressed: ON
/favicon.ico:
file.file: /usr/share/webapps/cgit/favicon.ico
file.send-compressed: ON
/robots.txt:
file.file: /usr/share/webapps/cgit/robots.txt
/cgit.png:
file.file: /usr/share/webapps/cgit/cgit.png
/:
fastcgi.spawn: /usr/share/h2o/fastcgi-cgi
setenv:
SCRIPT_FILENAME: /usr/lib/cgit/cgit.cgi
compress: ON
cgit 配置
有关所有配置选项的列表,请参阅 cgitrc(5)。
基本配置
在开始添加仓库之前,您首先必须在 /etc/cgitrc 创建基本的 cgit 配置文件。
# # cgit config # # The defaults #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, cgit.example.org/ has this value: virtual-root=/
添加仓库
现在您可以添加您的仓库
# # 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 (repository with the working tree) repo.url=MyOtherRepo repo.path=/srv/git/MyOtherRepo/.git repo.desc=That's my other git repository
或者,也可以配置 cgit 以自动搜索仓库
scan-path=/srv/git/
如果您使用上述方法,请将描述添加到 .git/description 文件,并添加以下行以显示作者
.git/config
[gitweb]
owner = John Cena <john@riseup.net>
如果您来自 gitweb 并希望保留描述和所有者信息,请使用
enable-git-config=1
语法高亮
cgit 在查看 blobs 时支持语法高亮。要启用语法高亮,您有多种选择。
使用 python-pygments
安装 python-pygments 并在 /etc/cgitrc 中添加过滤器
source-filter=/usr/lib/cgit/filters/syntax-highlighting.py
要更改着色样式,请修改传递给 syntax-highlighting.py 文件中 HtmlFormatter 的 style 参数。例如,要将着色样式更改为“tango”
formatter = HtmlFormatter(encoding='utf-8', style='tango')
要获取所有可用着色样式的列表,请执行
$ 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']
使用 highlight
安装 highlight 软件包。
将 /usr/lib/cgit/filters/syntax-highlighting.sh 复制到 /usr/lib/cgit/filters/syntax-highlighting-edited.sh。然后,在复制的文件中,注释掉版本 2 并注释掉版本 3。您可能需要将 --inline-css 添加到 highlight 的选项中,以获得更丰富多彩的输出,而无需编辑 cgit 的 css 文件。
# 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
在 /etc/cgitrc 中启用过滤器
source-filter=/usr/lib/cgit/filters/syntax-highlighting-edited.sh
/usr/lib/cgit/filters/syntax-highlighting.sh 将在 cgit 更新后丢失所有修改。格式化 about 页面
cgit 可以使用 Markdown、reStructuredText、man page 语法、文本文件和 html 文件显示格式化的 about 页面。
- 对于 Markdown 格式,安装 python-markdown。
- 对于 reStructeredText 格式,安装 python-docutils。
- 要使用 man page 语法,请安装 groff。
脚本 /usr/lib/cgit/filters/about-formatting.sh 与 /etc/cgitrc 中的 about-filter 或 repo.about-filter 一起使用。例如
about-filter=/usr/lib/cgit/filters/about-formatting.sh readme=:README.md
about-formatting.sh 的工作方式是根据输入文件的扩展名,在 html-converters 子目录中运行特定的脚本。上述配置允许 Markdown 格式,只要 README.md 位于仓库默认分支的根目录中,并且该脚本被赋予了可执行权限。
为了获得更轻量级的 Markdown 转换器,安装 md4c 并创建一个新的过滤器 /usr/lib/cgit/filters/md2html.sh,它运行 md2html --github。
集成
Gitosis
如果要与 gitosis 集成,您将必须运行两个命令来授予 Apache 权限以查看文件夹。
# chgrp http /srv/gitosis # chmod a+rx /srv/gitosis
Gitolite
如果您添加了由 gitolite 管理的仓库,则必须更改权限,以便 Web 服务器可以访问文件。
- 将 http 用户添加到 gitolite 组
- 以 root 用户身份运行
usermod -aG gitolite http。
- 以 root 用户身份运行
- 更改未来仓库的权限
- 编辑
/var/lib/gitolite/.gitolite.rc。将UMASK更改为0027 - 另请参阅:https://gitolite.com/gitolite/rc.html#specific-variables
- 编辑
- 更改 gitolite 主目录和现有仓库的权限。运行以下两个命令
- 以 root 用户身份运行
chmod g+rX /var/lib/gitolite。 - 以 root 用户身份运行
chmod -R g+rX /var/lib/gitolite/repositories。
- 以 root 用户身份运行
- 如果您将 scan-path 与 project-list 结合使用,请更改项目列表的权限。运行以下命令
- 以 root 用户身份运行
chmod g+r /var/lib/gitolite/projects.list。
- 以 root 用户身份运行
故障排除
以下故障排除子章节主要概述了由 cgit 配置文件中设置顺序引起的问题。为了安全起见,请尝试确保在 scan-path 之前定义所有全局设置。
snapshots 未正确显示
如果您已启用 scan-path 以及 snapshots,则 cgitrc 中的顺序很重要。根据 cgit 邮件列表,snapshots 应在 scan-path 之前指定
snapshots=tar.gz tar.bz2 zip scan-path=/path/to/your/repositories
readme 文件未找到,about 标签未显示
如果您添加了一个或多个 readme 条目,这些条目定义了 cgit 在填充 about 标签时将搜索的文件,并且您确定它们与仓库中的 README 文件匹配,但 about 标签未显示,请确保在 scan-path 之前指定 readme 条目。
source-filter 未正常工作
如果您已启用 scan-path,同样,cgitrc 中的顺序很重要。source-filter 应在 scan-path 之前指定,否则它将不起作用。
参见
- https://git.zx2c4.com/cgit/
- https://git.zx2c4.com/cgit/about/
- https://git.zx2c4.com/cgit/tree/README
- https://git.zx2c4.com/cgit/tree/cgitrc.5.txt
- https://text.causal.agency/007-cgit-setup.txt - 使用 Nginx 服务器的 cgit 设置。
- https://git.codemadness.org/stagit/ - stagit,一个静态 git 页面生成器。
- https://git.causal.agency/cgit-pink/about/ - cgit-pink,一个具有许多增强功能的 fork。