运行 Git 服务器

简介

本节将介绍如何设置、管理和保护 git 服务器。Git 有许多可用选项。更详细的文档请参阅 https://git-scm.com/book/en/v2

服务器依赖

必需

git-2.55.0OpenSSH-10.3p1

设置 Git 服务器

以下说明将安装一个 git 服务器。它将配置为使用 OpenSSH 作为安全的远程访问方法。

服务器的配置包括以下步骤:

1. 设置用户、组和权限

初始配置部分需要您以 root 用户身份执行。使用以下命令创建 git 用户和组,并设置一个不可用的密码哈希:

groupadd -g 58 git &&
useradd -c "git Owner" -d /home/git -m -g git -s /usr/bin/git-shell -u 58 git &&
sed -i '/^git:/s/^git:[^:]:/git:NP:/' /etc/shadow

设置一个不可用的密码哈希(将 ! 替换为 NP)会解锁该账户,但无法通过密码认证登录。这是 sshd 正常工作所必需的。 接下来,在 git 用户的主目录中创建一些文件和目录,以便使用 ssh 密钥访问 git 仓库。

install -o git -g git -dm0700 /home/git/.ssh &&
install -o git -g git -m0600 /dev/null /home/git/.ssh/authorized_keys

对于任何应具有仓库访问权限的开发者,请将其公钥 ssh 密钥添加到 /home/git/.ssh/authorized_keys 中。 首先,添加一些选项前缀,以防止用户利用到 git 的连接进行端口转发到 git 服务器可能访问到的其他机器。

echo -n "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty " \
     >> /home/git/.ssh/authorized_keys &&
cat <user-ssh-key> >> /home/git/.ssh/authorized_keys

通过修改 git 配置来设置新仓库的默认初始分支名称也很有用。以 root 用户身份运行:

git config --system init.defaultBranch trunk

最后,将 /usr/bin/git-shell 条目添加到 /etc/shells 配置文件中。该 shell 已在 git 用户配置文件中设置,用于确保只能执行与 git 相关的操作:

echo "/usr/bin/git-shell" >> /etc/shells

2. 创建 git 仓库

仓库可以位于文件系统上的任何位置。重要的是 git 用户对该位置具有读/写访问权限。我们使用 /srv/git 作为基础目录。使用以下命令创建一个新的 git 仓库(以 root 用户身份):

[注意]

注意

在下面的所有说明中,我们使用 project1 作为示例仓库名称。您应根据您的具体项目为仓库起一个简短的描述性名称。

install -o git -g git -m755 -d /srv/git/project1.git &&
cd /srv/git/project1.git                             &&
git init --bare                                      &&
chown -R git:git .

3. 从客户端系统填充仓库

[注意]

注意

本节和下一节中的所有说明应在用户系统上执行,而不是在服务器系统上。

仓库创建后,开发者可以将其用于放入一些文件。一旦用户的 ssh 密钥被导入到 git 的 authorized_keys 文件中,该用户就可以与仓库交互。

开发者系统上应有一个最小配置,指定其用户名和电子邮件地址。在客户端创建此最小配置文件:

cat > ~/.gitconfig <<EOF
[user]
        name = <users-name>
        email = <users-email-address>
EOF

在开发者的机器上,设置一些要推送到仓库的文件作为初始内容:

[注意]

注意

下面使用的 gitserver 术语应为 git 服务器的主机名(或 IP 地址)。

mkdir myproject
cd myproject
git init --initial-branch=trunk
git remote add origin git@gitserver:/srv/git/project1.git
cat >README <<EOF
This is the README file
EOF
git add README
git commit -m 'Initial creation of README'
git push --set-upstream origin trunk

现在初始内容已被推送到服务器,并可供其他用户使用。在当前机器上,参数 --set-upstream origin trunk 现在不再需要,因为本地仓库已连接到远程仓库。后续推送可以执行:

git push

其他开发者现在可以克隆仓库并对内容进行修改(只要他们的 ssh 密钥已被安装):

git clone git@gitserver:/srv/git/project1.git
cd project1
vi README
git commit -am 'Fix for README file'
git push
[注意]

注意

这是一个基于 OpenSSH 访问的非常基础的服务器设置。所有开发者都使用 git 用户在仓库上执行操作,用户提交的更改可以通过本地用户名(参见 ~/.gitconfig)进行区分,该用户名记录在变更集中。

访问受到添加到 git 的 authorized_keys 文件中的公钥限制,公众无法导出/克隆该仓库。要启用此功能,请继续执行步骤 4 以设置 git 服务器,提供公开的只读访问。

在用于克隆项目的 URL 中,必须指定绝对路径(此处为 /srv/git/project1.git),因为仓库不在 git 的主目录中,而是在 /srv/git 中。为了消除暴露服务器安装结构的需要,可以在 git 的主目录中为每个项目添加一个符号链接,如下所示:

ln -svf /srv/git/project1.git /home/git/

现在,可以使用以下命令克隆仓库:

git clone git@gitserver:project1.git

4. 配置服务器

上述设置使仓库对经过身份验证的用户(通过提供 ssh 公钥文件)可用。还有一种简单的方法可以将仓库发布给未经身份验证的用户——当然没有写权限。

通过 ssh 访问(供经过身份验证的用户使用)和通过守护进程将仓库导出给未经身份验证的用户相结合,在大多数情况下足以满足开发站点的需求。

[注意]

注意

默认情况下,守护进程将在端口 9418 上侦听。请确保您的防火墙设置允许访问该端口。

要在启动时启动服务器,请从 blfs-systemd-units-20251204 软件包安装 git-daemon.service 单元:

make install-git-daemon

为了允许 git 导出仓库,需要在服务器上每个仓库目录中放置一个名为 git-daemon-export-ok 的文件。该文件不需要任何内容,仅其存在即可启用导出,其缺失则禁止导出该仓库。

touch /srv/git/project1.git/git-daemon-export-ok

 随 git-daemon.service 单元一起,还安装了一个名为 /etc/default/git-daemon 的配置文件。请检查此配置文件以符合您的需求。

配置文件中只有三个选项需要设置:

  • GIT_BASE_DIR=<dirname>

    指定 git 仓库的位置。访问守护进程时使用的相对路径将相对于此目录进行解析。

  • DFT_REPO_DIR=<dirname>

    此目录被添加到允许目录的白名单中。此变量可以包含多个目录名,但通常设置为等于 GIT_BASE_DIR

  • GIT_DAEMON_OPTS=<options>

    如果 git daemon 命令需要特殊选项,则必须在此设置中指定它们。一个示例可能是调整守护进程侦听的端口号。在这种情况下,请将 --port=<port number> 添加到此变量中。有关可以设置哪些选项的更多信息,请查看 git daemon --help 的输出。

启动守护进程后,未经身份验证的用户可以通过以下命令克隆已导出的仓库:

git clone git://gitserver/project1.git

由于基础目录默认为 /srv/git(或在配置中设置为自定义值),git 将传入路径(/project1.git)解释为相对于该基础目录,因此提供 /srv/git/project1.git 中的仓库。