章节 ▾ 第二版

4.5 服务器上的 Git - Git 守护进程

Git 守护进程

接下来,我们将设置一个使用“Git”协议提供仓库服务的守护进程。对于需要快速、无需身份验证访问 Git 数据的情况,这是一种常见的选择。请记住,由于这不是一个经过身份验证的服务,因此通过此协议提供的任何内容在其网络范围内都是公开的。

如果您在防火墙之外的服务器上运行此服务,则它应该仅用于对全球公开可见的项目。如果您的服务器位于防火墙内,您可以将其用于需要大量人员或计算机(如持续集成或构建服务器)进行只读访问,且您不想为每个用户或机器添加 SSH 密钥的项目。

无论如何,Git 协议都相对容易设置。基本上,您需要以守护进程的方式运行以下命令

$ git daemon --reuseaddr --base-path=/srv/git/ /srv/git/

--reuseaddr 选项允许服务器在不等待旧连接超时的情况下重启,而 --base-path 选项允许用户在无需指定完整路径的情况下克隆项目,最后的路径则告诉 Git 守护进程到哪里去查找要导出的仓库。如果您正在运行防火墙,还需要在设置此服务的机器上为 9418 端口开辟一个通道。

根据您运行的操作系统,可以通过多种方式将此进程守护进程化。

由于 systemd 是现代 Linux 发行版中最常用的初始化系统,您可以使用它来实现此目的。只需在 /etc/systemd/system/git-daemon.service 中放置一个包含以下内容的文件

[Unit]
Description=Start Git Daemon

[Service]
ExecStart=/usr/bin/git daemon --reuseaddr --base-path=/srv/git/ /srv/git/

Restart=always
RestartSec=500ms

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=git-daemon

User=git
Group=git

[Install]
WantedBy=multi-user.target

您可能已经注意到,这里的 Git 守护进程是以 git 作为用户和组启动的。请根据您的需求进行修改,并确保系统中存在所提供的用户。此外,请检查 Git 二进制文件是否确实位于 /usr/bin/git,如果需要,请更改路径。

最后,您可以运行 systemctl enable git-daemon 以便在开机时自动启动该服务,并分别使用 systemctl start git-daemonsystemctl stop git-daemon 来启动和停止服务。

在其他系统上,您可能需要使用 xinetdsysvinit 系统中的脚本或其他方式——只要您能以某种方式实现该命令的守护进程化并对其进行监控即可。

接下来,您必须告诉 Git 哪些仓库允许进行无需身份验证的 Git 服务器访问。您可以通过在每个仓库中创建一个名为 git-daemon-export-ok 的文件来完成此操作。

$ cd /path/to/project.git
$ touch git-daemon-export-ok

该文件的存在告诉 Git,此项目可以在无需身份验证的情况下进行服务。