Gitolite

来自 ArchWiki

Gitolite 允许您轻松安全地为多用户托管 Git 仓库。

安装

安装 gitolite 软件包。

配置

安装 gitolite 会自动将 gitolite 用户添加到系统,其主目录为 /var/lib/gitolite

管理员 SSH 访问

要授予您自己管理员访问权限,请将您的 SSH 公钥复制到 /var/lib/gitolite/username.pub,其中 username 是您的用户名。

# install -o gitolite -g gitolite ~/.ssh/id_rsa.pub /var/lib/gitolite/username.pub

然后以 gitolite 用户身份运行 Gitolite 设置脚本

[gitolite]$ gitolite setup -pk /var/lib/gitolite/username.pub

这会将您的公钥放入 gitolite-admin keydir,并授予您的用户名对 gitolite-admin 仓库的 RW+ 访问权限

您现在可以删除 SSH 公钥的副本

# rm /var/lib/gitolite/username.pub

现在以您的用户身份,您可以检查一切是否正常

$ ssh gitolite@hostname info
hello username, this is gitolite@hostname running gitolite3 v3.6.2 on git 2.3.3

 R W    gitolite-admin
 R W    testing

不要以服务器上的 gitolite 身份直接添加仓库或用户!服务器必须通过克隆特殊的 gitolite-admin 仓库进行管理

$ git clone gitolite@hostname:gitolite-admin

有关参考,请参阅 Gitolite

创建仓库

要创建仓库,首先以客户端身份检出 gitolite-admin 仓库。

$ git clone gitolite@server:gitolite-admin

将新仓库附加到 gitolite-admin/conf/gitolite.conf

repo repository_name
    RW+     =   @all

提交并推送更改,gitolite 将自动在服务器上生成必要的文件。

通过 Apache 添加 http(s) 访问(使用基本身份验证)

我们需要创建一个 suEXEC 包装脚本。为了满足 suEXEC 的安全要求,脚本和包含它的目录必须由 gitolite:gitolite 拥有,并且在目录层次结构中位于 /srv/http 下。在此示例中,我们将目录创建为 /srv/http/git/cgi-bin

# install -o gitolite -g gitolite -d /srv/http/git/cgi-bin

使用以下内容为 gitolite shell 创建一个 suEXEC 包装器。在此示例中,我们将其创建为 /srv/http/git/cgi-bin/gitolite-suexec-wrapper

/srv/http/git/cgi-bin/gitolite-suexec-wrapper
#!/usr/bin/bash
#
# suEXEC wrapper for gitolite-shell
#

export GIT_PROJECT_ROOT=/var/lib/gitolite/repositories
export GITOLITE_HTTP_HOME=/var/lib/gitolite

exec /usr/lib/gitolite/gitolite-shell

使包装器可执行,并由 gitolite:gitolite 拥有。

# chown gitolite:gitolite /srv/http/git/cgi-bin/gitolite-suexec-wrapper
# chmod 0755 /srv/http/git/cgi-bin/gitolite-suexec-wrapper

创建一个空的密码数据库文件,由 gitolite:http 拥有

# install -o gitolite -g http -m 0640 /dev/null /srv/http/git/htpasswd

Apache 的基本身份验证机制与 ssh 分离,因此需要单独的凭据集。使用 htpasswd 创建您的 Web 用户。

# htpasswd /srv/http/git/htpasswd username

将以下内容添加到您的 Apache vhost 配置中

SuexecUserGroup gitolite gitolite
ScriptAlias /git/ /srv/http/git/cgi-bin/gitolite-suexec-wrapper/

<Directory /srv/http/git/cgi-bin>
    Require all granted
</Directory>

<Location /git>
    AuthType Basic
    AuthName "Git Access"
    AuthBasicProvider file
    AuthUserFile /srv/http/git/htpasswd
    Require valid-user
</Location>

重启 httpd.service

最后,在您在前一节中克隆的 gitolite-admin 仓库中,编辑 conf/gitolite.conf,为所有您想通过 http 提供的仓库添加 R = daemon 访问规则,并推送更改。

添加用户

ssh 用户

请每个将获得访问权限的用户向您发送 SSH 公钥。将每个公钥重命名为 username.pub,其中 username 将在 gitolite.conf 中使用。然后将所有新的公钥移动到克隆的 gitolite-admin 仓库中的 keydir 目录。如果您愿意,也可以将它们组织到 keydir 的各个子目录中,因为将搜索整个树。

最后提交并推送更改。

有关详细信息,请参阅官方文档中的 添加/删除用户

要授予新用户访问权限,请编辑配置文件(gitolite-admin 仓库中的 conf/gitolite.conf)。有关详细信息,请参阅官方文档中的 .conf 文件

http(s) 用户

http(s) 的用户管理更适合单用户设置。要添加新用户或更改现有用户的密码

# htpasswd /srv/http/git/htpasswd username

故障排除

如果您无法使用 gitolite 帐户登录,则可能是由于该帐户被锁定,这取决于您的 ssh 配置。

如果您进行了一些 SSH 强化,则可能是导致此行为的原因,如 SSH 和锁定用户文章Unix & Linux StackExchange - 如何解锁账户以进行公钥 SSH 授权,但不用于密码授权 中所述。

要解决此问题,您必须在 sshd_config 中允许 PAM 或通过以下方式解锁帐户

# usermod -p '*' gitolite
/etc/passwd
...
gitolite:*:16199:0:99999:7:::
...
警告: 不要将帐户置于 passwd -u 留下的状态(使用空白密码字段)。这样做将允许在不输入密码的情况下登录!

参见