章节 ▾ 第二版

4.2 在服务器上搭建Git服务

在服务器上搭建Git服务

现在,我们将介绍如何在自己的服务器上设置运行这些协议的 Git 服务。

注意

在这里,我们将演示在基于 Linux 的服务器上进行基本、简化安装所需的命令和步骤,不过这些服务也可以在 macOS 或 Windows 服务器上运行。在您的基础设施中实际设置生产服务器,肯定会在安全措施或操作系统工具方面有所不同,但希望这能让您对所涉及的内容有一个大致的了解。

为了初步设置任何 Git 服务器,您必须将现有仓库导出到一个新的裸仓库中——一个不包含工作目录的仓库。这通常很简单。为了克隆您的仓库以创建新的裸仓库,您需要运行带 --bare 选项的 clone 命令。按照惯例,裸仓库目录名以 .git 为后缀,例如:

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

现在您应该在 my_project.git 目录中拥有 Git 目录数据的副本。

这大致等同于:

$ cp -Rf my_project/.git my_project.git

配置文件中有一些细微的差别,但就您的目的而言,这与它们几乎相同。它单独获取 Git 仓库,不带工作目录,并专门为它创建一个目录。

将裸仓库放到服务器上

现在您已经有了仓库的裸副本,您需要做的就是将其放到服务器上并设置您的协议。假设您已经设置了一个名为 git.example.com 的服务器,您有 SSH 访问权限,并且您希望将所有 Git 仓库存储在 /srv/git 目录中。假设该服务器上存在 /srv/git,您可以通过复制裸仓库来设置您的新仓库:

$ scp -r my_project.git user@git.example.com:/srv/git

此时,对该服务器上 /srv/git 目录具有基于 SSH 的读取权限的其他用户可以通过运行以下命令克隆您的仓库:

$ git clone user@git.example.com:/srv/git/my_project.git

如果用户通过 SSH 登录到服务器并对 /srv/git/my_project.git 目录具有写入权限,他们也将自动拥有推送权限。

如果您使用 --shared 选项运行 git init 命令,Git 将自动为仓库正确添加组写入权限。请注意,运行此命令不会在此过程中销毁任何提交、引用等。

$ ssh user@git.example.com
$ cd /srv/git/my_project.git
$ git init --bare --shared

您可以看到将 Git 仓库转换为裸版本并将其放置在您和您的协作者都有 SSH 访问权限的服务器上是多么容易。现在您已准备好在同一个项目上进行协作。

重要的是要记住,这就是您运行一个有用且多人可访问的 Git 服务器所需要的全部内容——只需在服务器上添加可 SSH 访问的帐户,并将裸仓库放在所有这些用户都具有读写访问权限的地方。您已准备就绪——不需要其他任何东西。

在接下来的几节中,您将看到如何扩展到更复杂的设置。这包括不必为每个用户创建用户帐户、为仓库添加公共读取访问权限、设置 Web UI 等。但是,请记住,要与几个人协作进行私人项目,您 需要 的只是一个 SSH 服务器和一个裸仓库。

小型设置

如果您是一个小团队,或者只是在您的组织中尝试 Git,并且只有少数开发人员,那么事情对您来说可以很简单。设置 Git 服务器最复杂的一个方面是用户管理。如果您希望某些仓库对某些用户是只读的,而对其他用户是读/写的,那么访问和权限的安排可能会有点困难。

SSH 访问

如果您有一个所有开发人员都已经拥有 SSH 访问权限的服务器,那么在那里设置您的第一个仓库通常是最简单的,因为您几乎不需要做任何工作(正如我们在上一节中介绍的)。如果您希望对仓库进行更复杂的访问控制类型权限管理,则可以使用服务器操作系统的普通文件系统权限来处理它们。

如果您想将仓库放置在没有为团队中所有需要授予写入访问权限的人创建帐户的服务器上,那么您必须为他们设置 SSH 访问。我们假设如果您有一个可以做到这一点的服务器,您已经安装了 SSH 服务器,并且您就是通过这种方式访问服务器的。

有几种方法可以授予团队中每个人访问权限。第一种是为每个人设置帐户,这很简单但可能很麻烦。您可能不想运行 adduser(或可能的替代 useradd)并为每个新用户设置临时密码。

第二种方法是在机器上创建一个单独的“git”用户帐户,要求每个需要写入权限的用户向您发送一个 SSH 公钥,并将该密钥添加到该新“git”帐户的 ~/.ssh/authorized_keys 文件中。此时,每个人都将能够通过“git”帐户访问该机器。这不会以任何方式影响提交数据——您连接时使用的 SSH 用户不会影响您记录的提交。

另一种方法是让您的 SSH 服务器从 LDAP 服务器或您可能已经设置的任何其他集中式身份验证源进行身份验证。只要每个用户都能在机器上获得 shell 访问权限,您能想到的任何 SSH 身份验证机制都应该有效。

scroll-to-top