章节 ▾ 第二版

4.2 Git 服务器 - 在服务器上搭建 Git

在服务器上搭建 Git

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

注意

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

为了最初设置任何 Git 服务器,您必须将现有仓库导出到一个新的裸仓库中——一个不包含工作目录的仓库。 这通常很容易做到。 为了克隆您的仓库以创建一个新的裸仓库,您可以运行带有--bare 选项的克隆命令。 按照惯例,裸仓库目录名称以后缀.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