如果我们需要在多台机器之间同步我们的工作内容,把 Git 仓库放到服务端会方便很多。最简单的 Git 服务器是直接通过 SSH 访问存放在服务端文件系统某个目录下的裸仓库,不需要配置任何东西。这种方法虽然简单高效,但也有其局限性。如果你不希望公开 SSH 权限,或者存在网络访问限制的话,有时候通过 HTTPS 访问 Git 仓库有它的优势所在。HTTPS 访问不仅可以绕过某些网络限制,还能提供更高的安全性和灵活性,适用于更多的使用场景。以下是具体的步骤:

1 创建 Git 仓库根目录

首先,在 /srv 目录下创建 Git 仓库根目录。然后,修改目录权限,以便让 Apache2 运行所使用的 www-data 用户完全控制该目录:接下来,在仓库目录下创建一个测试用的裸仓库(例如名为 sandbox.git):

sudo mkdir /srv/git
sudo chown www-data:www-data /srv/git
sudo -u www-data git init --bare --initial-branch=main /srv/git/sandbox.git

2 配置 DNS 启用 git 二级域名

登录域名提供商网站,为 git. 二级域名添加 A 记录和 AAAA 记录,指向服务器 IP 地址。

3 添加 Virtual Host

接下来,我们在服务器上为这个域名添加 Virtual Host。到 /etc/apache2/sites-available 目录下创建新文件 005-git.conf,内容如下:

<Directory "/srv/git">
    Options +ExecCGI +Indexes +SymLinksIfOwnerMatch
    AllowOverride None
    Require all granted
</Directory>

<VirtualHost *:80>
    ServerName git.yourserver.name
    ServerAdmin root@yourserver.name

    ErrorLog ${APACHE_LOG_DIR}/error-git.log
    CustomLog ${APACHE_LOG_DIR}/access-git.log combined

    ScriptAlias / /usr/lib/git-core/git-http-backend/
    SetEnv GIT_PROJECT_ROOT /srv/git
    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER

    <Files "git-http-backend">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /srv/git/.htpasswd
        Require valid-user
    </Files>

</VirtualHost>

4 创建 HTTP 用户名和密码

运行以下命令创建用户名和密码:

sudo -u www-data htpasswd -c /srv/git/.htpasswd 用户名

回车后会提问密码并要求重复密码,输入密码的时候屏幕上不会回显。

注意:只有第一次创建文件时需要使用 -c 参数,之后如果想添加用户,不要加 -c,否则会清空已有文件。

5 启用新创建的虚拟站点

配置完毕之后我们重启 Apache2 服务器:

sudo a2ensite 005-git
sudo systemctl restart apache

6 测试

在本地机器上运行

Git 应该提示输入用户名密码。使用之前创建的用户名密码登录后,应该能正常签出代码。在签出的目录下进行一些修改,提交后测试 git push 是否正常工作。为了减少输入用户名密码的次数,建议运行 git config --global credential.helper cache,这样输入过一次密码之后的 15 分钟内不需要再次输入密码。

7 添加 SSL 证书

如果你使用 Let’s Encrypt 提供的 SSL 证书,运行 sudo certbot,根据提示更新 SSL 证书。然后在本地机器上重新测试使用 HTTPS 签出代码:

8 完成

今后创建新的 git 仓库时,运行命令:

sudo -u www-data git init --bare --initial-branch=main /srv/git/仓库名.git