章节 ▾ 第二版

4.2 Git 在服务器上 - 在服务器上安装 Git

在服务器上安装 Git

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

注意

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

为了初步设置任何 Git 服务器,您必须将现有的仓库导出为一个新的裸仓库(bare repository)— 这是一个不包含工作目录的仓库。这通常很容易做到。为了克隆您的仓库来创建一个新的裸仓库,您需要使用 --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 目录具有写入权限,他们也将自动拥有推送权限。

如果您使用 git init 命令并带上 --shared 选项,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 身份验证机制都应该有效。