以下说明将安装一个 git 服务器。它将配置为使用 OpenSSH 作为安全的远程访问方法。
服务器的配置包括以下步骤:
初始配置部分需要您以 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
仓库可以位于文件系统上的任何位置。重要的是 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 .
本节和下一节中的所有说明应在用户系统上执行,而不是在服务器系统上。
仓库创建后,开发者可以将其用于放入一些文件。一旦用户的 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
上述设置使仓库对经过身份验证的用户(通过提供 ssh 公钥文件)可用。还有一种简单的方法可以将仓库发布给未经身份验证的用户——当然没有写权限。
通过 ssh 访问(供经过身份验证的用户使用)和通过守护进程将仓库导出给未经身份验证的用户相结合,在大多数情况下足以满足开发站点的需求。
默认情况下,守护进程将在端口 9418
上侦听。请确保您的防火墙设置允许访问该端口。
要在启动时启动服务器,请安装 blfs-bootscripts-20251220 软件包中包含的 git-daemon 启动脚本:
make install-git-daemon
为了允许 git
导出仓库,需要在服务器上每个仓库目录中放置一个名为 git-daemon-export-ok
的文件。该文件不需要任何内容,仅其存在即可启用导出,其缺失则禁止导出该仓库。
touch /srv/git/project1.git/git-daemon-export-ok
启动 git 守护进程的脚本在内部使用一些默认值。最重要的是仓库目录的路径,设置为 /srv/git。如果由于某种原因您在另一个位置创建了仓库,则需要告诉启动脚本在哪里可以找到仓库。这可以通过创建一个名为
/etc/sysconfig/git-daemon
的配置文件来实现。如果该配置文件存在,它将被导入,因此它是可选的。该文件可以如下所示:
# Begin /etc/sysconfig/git-daemon # 指定 git 项目的位置 GIT_BASE_DIR="/srv/git/" # 添加到白名单的目录 DFT_REPO_DIR="$GIT_BASE_DIR" # 在 'git daemon' 后添加的选项 # 命令会在启动脚本中运行 GIT_DAEMON_OPTS="" # End /etc/sysconfig/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 中的仓库。