git instaweb
是一个非常方便的浏览存储库的命令。但一些有趣的功能默认被禁用。
每次运行
.git/gitweb/gitweb_config.perl
时,主配置文件(git instaweb
)都会被重写,因此不可能在那里存储配置。
我尝试通过创建全局配置文件来启用一些所需的功能。
最初我尝试创建
/etc/gitweb.conf
,包含以下两行:
$feature{'highlight'}{'default'} = [1];
$feature{'blame'}{'default'} = [1];
但是没有成功。然后我尝试创建文件
/etc/gitweb-common.conf
。也没有成功。
这些行对生成的 Web 界面没有影响,我不断收到
403 - Blame view not allowed
。
检查
/usr/share/gitweb/gitweb.cgi
的源代码,我注意到如果从变量 $GITWEB_CONFIG 中的文件读取全局配置(这是我们特定存储库新生成的配置文件),那么脚本将永远不会尝试读取 $GITWEB_CONFIG 中的文件GITWEB_CONFIG_SYSTEM (/etc/gitweb.conf
),在此之前返回。因此,在这种情况下,使用此文件不适用。
但是没有解释为什么不读取$GITWEB_CONFIG_COMMON(
/etc/gitweb-common.conf
),它是在$GITWEB_CONFIG之前读取的。
经过一番研究,我尝试使用基本的
/usr/share/gitweb/gitweb.cgi
语句来调试 print
中的 CGI 脚本。最终我收敛到以下子程序:
# read and parse gitweb config file given by its parameter.
# returns true on success, false on recoverable error, allowing
# to chain this subroutine, using first file that exists.
# dies on errors during parsing config file, as it is unrecoverable.
sub read_config_file {
my $filename = shift;
return unless defined $filename;
# die if there are errors parsing config file
if (-e $filename) {
do $filename;
die $@ if $@;
return 1;
}
return;
}
Perl 使用两个不同的变量来管理来自
do
的错误。一种是$@
,当do
无法编译文件时设置它。另一个是$!
,这是为了防止do
无法读取文件而设置的。通过打印 $!
的值,我发现它被设置为 Permission denied
。由于该脚本当前不测试 $!
,因此该错误不会被注意到。 (Perl 做块文档)
要解决此问题,必须将以下行添加到
/etc/apparmor.d/usr.share.git-web.gitweb.cgi
:
/usr/libexec/git/git rix,