Gitosis

出自 ArchWiki

Gitosis 是一个工具,为托管的 Git 仓库提供访问控制和远程管理。它允许通过 SSH 对读取和写入访问进行细粒度管理,而无需用户在服务器上拥有本地系统帐户。为此,它设置了一个单独的系统帐户 git,然后用于所有 Git 访问。

Gitosis 在其 README 文件中提供了安装说明。本指南基于这些说明。

安装与设置

AUR 安装 gitosis-gitAUR 软件包。这将创建三件事

  • git 用户
  • 此用户所属的 git 用户组
  • /srv/gitosis 目录,用于保存 Gitosis 的数据和仓库

要配置 Gitosis,您无需直接在服务器上编辑文件。相反,Gitosis 提供了一个 Git 仓库,其中包含配置。要更新此配置,您可以像使用任何其他仓库一样克隆、提交和推送 gitosis-admin

由于 Gitosis 使用 SSH 密钥 来验证用户身份,因此您需要生成一个密钥对用于管理仓库。如果您没有密钥对,可以使用 ssh-keygen 生成,例如

$ ssh-keygen -t rsa

现在您可以初始化管理仓库。

$ sudo -H -u git gitosis-init < /path/to/public_key.pub
Initialized empty Git repository in /srv/gitosis/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /srv/gitosis/repositories/gitosis-admin.git/
注意: 在某些情况下,这可能会导致如下错误
OSError: [Errno 13] Permission denied: '//gitosis'

这可能是由于 git 主目录未正确设置所致。通过手动设置来修复它

# usermod -d /srv/gitosis git

此外,此命令还会创建目录 /srv/gitosis/repositories,实际托管的仓库将存储在该目录中。

在管理仓库初始化完成后,禁用用户 git 基于密码的 ssh 登录可能是明智的。

/etc/ssh/sshd_config
Match User git
PasswordAuthentication no

配置

如上所述,Gitosis 通过将提交推送到 gitosis-admin 仓库进行配置。要克隆此仓库(使用 Gitosis!),请运行

$ git clone git@your.git.server:gitosis-admin.git

gitosis-admin 仓库中,您将看到两件事

  • gitosis.conf – Gitosis 的配置文件和仓库权限
  • keydir – 包含每个用户公钥的目录

要修改仓库或用户,或配置 Gitosis,只需在您的克隆中提交更改并将它们推送回服务器即可。

仓库与权限

您可以在 /usr/share/doc/gitosis 中找到一些示例配置文件。

[gitosis]
gitweb = yes

[repo foobar]
description = Git repository for foobar
owner = user

[group devs]
members = user1 user2

[group admins]
members = user1

[group gitosis-admin]
writable = gitosis-admin
members = @admins

[group foobar]
writable = foobar
members = @devs

[group myteam]
writable = free_monkey
members = jdoe

[group deployer]
writable = free_monkey
readonly = monkey_deployer

这定义了一个名为 “free_monkey” 的新组,这是一个任意字符串。“jdoe” 是 myteam 的成员,并且将拥有对 “gitosis” 仓库的写入权限。“monkey_deployer” 密钥将仅对 “free_monkey” 具有只读访问权限。

将此添加到 gitosis.conf,提交并推送它

$ git commit -a -m "Allow jdoe write access to free_monkey"
$ git push

现在用户 “jdoe” 具有写入名为 “free_monkey” 的仓库的权限,但是我们仍然没有创建仓库。我们将要做的是在本地创建一个新仓库,在 Git 服务器上初始化它,然后推送它

$ mkdir free_monkey
$ cd free_monkey
$ git init
$ git remote add origin git@YOUR_SERVER_HOSTNAME:free_monkey.git

做一些工作,git add 和 commit 文件

$ git push origin master:refs/heads/master

当使用 SSH 时,最后一个命令将失败,并显示错误消息 “does not appear to be a Git repository”。可以通过在服务器上手动初始化仓库来修复此问题

$ git init --bare /srv/gitosis/repositories/free_monkey.git

并重试最后一个命令

通过最后一次推送,您就可以开始了。“free_monkey” 仓库已在服务器上创建(在 /srv/gitosis/repositories 中),您可以像使用任何旧的 Git 仓库一样开始使用它。

Gitosis 仓库也可以与 gitweb 一起使用;只需将包含仓库的目录指向 gitweb 配置中的目录即可。

添加用户

接下来自然要做的事情是授予少数幸运儿对 FreeMonkey 项目的提交访问权限。这是一个简单的两步过程。

首先,收集他们的公共 SSH 密钥,我将其称为 “alice.pub” 和 “bob.pub”,并将它们放入本地 gitosis-admin 仓库的 keydir/ 中。其次,编辑 gitosis.conf 并将它们添加到 “members” 列表中。

$ cd gitosis-admin
$ cp ~/alice.pub keydir/
$ cp ~/bob.pub keydir/
$ git add keydir/alice.pub keydir/bob.pub

请注意,密钥文件名必须具有 “.pub” 扩展名。

gitosis.conf 更改

[group myteam]
members = jdoe alice bob
writable = free_monkey

提交并推送

$ git commit -a -m "Granted Alice and Bob commit rights to FreeMonkey"
$ git push

就这样。Alice 和 Bob 现在可以像这样克隆 free_monkey 仓库

$ git clone git@YOUR_SERVER_HOSTNAME:free_monkey.git

Alice 和 Bob 也将拥有提交权限。

公共访问

如果您正在运行一个公共项目,您将拥有具有提交权限的用户,然后您将拥有其他人。我们如何在不摆弄 SSH 密钥的情况下为每个人提供只读访问权限?

我们只需使用 git-daemon。这与 Gitosis 无关,并且它随 Git 本身一起提供。

[git]$ git-daemon --base-path=/srv/gitosis/repositories/ --export-all

这将使您使用 Gitosis 管理的所有仓库对公众只读。然后,某人可以像这样克隆 FreeMonkey

$ git clone git://YOUR_SERVER_HOSTNAME/free_monkey.git

要仅导出某些仓库而不是其他仓库,您需要在您要公开的每个仓库的根目录(例如 /srv/gitosis/repositories/free_monkey.git)中 touch git-daemon-export-ok。然后从上面的 git-daemon 命令中删除 “--export-all”。

更多技巧

此文章或章节需要语言、wiki 语法或风格改进。请参阅 Help:Style 以获取参考。

原因: 像博客一样编写,违反了 Help:Style#语言注册。(在 Talk:Gitosis 中讨论)

可以设置 gitosis.conf 来执行其他一些巧妙的技巧。打开 Gitosis 源代码目录(您最初在顶部克隆 Gitosis 的位置)中的 example.conf,以查看所有选项的摘要。您可以指定某些仓库为只读(与可写相反),但仍然不是公共的。组成员列表可以包含另一个组。还有一些其他的技巧,我将其留给读者去发现。

注意事项

如果服务器上的 /srv/gitosis/.gitosis.conf 似乎始终没有更新以匹配您的本地副本(它们应该匹配),即使您正在进行更改和推送,也可能是您的 post-update hook 不可执行。旧版本的 setuptools 可能会导致这种情况。请务必修复它。

如果您的 Python goodies 位于非标准位置,您还必须编辑 post-update 并在顶部添加 “export PYTHONPATH=…” 行。否则,当您第一次尝试在 gitosis-admin 中推送更改时,您将得到一个 Python 堆栈跟踪。

如果您想在非标准位置安装 Gitosis,我不建议这样做。这是一个边缘情况,作者直到我打扰他帮助我使其工作才遇到过。

对于勇敢者,您需要编辑系统上控制非登录、非交互式 shell 的默认 PATH 的任何文件。在 Ubuntu 上,这是 /etc/environment。将 gitosis-serve 的路径添加到 PATH 行。还要插入 PYTHONPATH 的行,并将其设置为您的非标准 Python site-packages 目录。例如,这是我的 /etc/environment

$ PATH="/home/$(whoami)/sys/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games"
$ PYTHONPATH=/home/$(whoami)/sys/lib/python2.4/site-packages

请务必在进行这些更改后注销并重新登录。

不要对我上面的标准安装使用 gitosis-init 行,而是使用这个稍微修改过的行

$ sudo -H -u git env PATH=$PATH gitosis-init < /tmp/id_rsa.pub

请务必如上所述在您的 post-update hook 中设置 PYTHONPATH。

那 *应该* 可以了。我对这种非标准设置故意简洁,因为我认为没有多少人会使用它。

非标准 SSH 端口

如果您在服务器上的非标准端口上运行 SSH,则有两种方法可以指定 Git 将尝试连接的端口。一种是明确声明您正在使用 SSH 协议,因为这允许您在 URL 中也放入端口号

git clone ssh://git@myserver.com:1234/repo.git

或者您可以将其放入您的 ~/.ssh/config 文件中

$ Host myserver.com
$ Port 1234
  • [repo] 块用于定义 gitweb 使用的一些必要区域。
  • [group] 块用于两者
    • 定义用户组
    • 定义仓库权限
  • @ 用于定义用户组。

您应该提交并推送您在此文件中所做的任何更改。

keydir

keydir 只是一个包含用户公钥的目录。一些密钥可以采用 user@machine 的形式,并且这些密钥必须在 gitosis.conf 中以该形式定义。最好创建用户组并将它们用作仓库的成员。一旦您添加新密钥以启用一些新用户,您应该将文件添加到 Git 仓库并提交和推送它们。新用户将使用上述 Git 命令形式,就像您用于克隆 gitosis-admin 仓库一样。

参见

  • Gitosis 源代码
  • Gitolite – Gitosis 的替代方案,提供许多类似的功能
  • Girocco – 在 repo.or.cz 上使用的 Git 托管代码
  • GitLab – 基于 Ruby on Rails 和 Gitolite 的免费 git 仓库管理应用程序。