Gitolite
Gitolite 允许您轻松安全地为多用户托管 Git 仓库。
安装
配置
安装 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
留下的状态(使用空白密码字段)。这样做将允许在不输入密码的情况下登录!