源码托管是目前程序开发环境中必不可少的一项基础服务。之前我通常会选择使用国外的 Github 或是国内的 Gitee 代码托管平台。不过随着这些平台因为特殊情况开始出现一些问题和限制后,我觉得有必要掌握一下自己架设 Git 服务的方法和流程了。
目前我所知道的大概有 4 种自己搭建 Git 服务的方法,我将从最简单的 SSH 方式开始来分别介绍它们的搭建方式。
使用 SSH
SSH 是最简单的 Git 服务搭建方式,它只需要一台运行了 SSH 服务的 Linux 服务器,以及安装好 Git 即可。登录到服务器上,创建一个存放源码的目录,比如命名为 repositories:
mkdir repositories
然后进入这个目录,然后使用 Git 命令创建一个项目源码仓库即可:
cd repositories
git init --bare demo.git
以上命令在 repositories 目录下创建了一个 demo.git 的源码仓库。接下来就只需要在本地开发环境下使用 SERVER-IP:PATH
地址格式来使用这个源码仓库了。比如我要使用这个在虚拟机上搭建的 Git 服务:
git clone 192.168.0.3:/home/zzxworld/repositories/demo.git
只要确保 IP 和仓库目录的路径没问题,就能正常开始使用了。如果不想每次使用时都要输入一次 SSH 登陆密码,可以通过证书方式配置 SSH 免密登陆,这样在使用体验上会好很多。
使用 Gogs
上面使用 SSH 搭建的 Git 服务只能说满足了基本需求。如果想要有类似 GitHub 类似的界面体验,可以试试这款 Go 语言编写的专业 Git 服务软件。
我目前比较青睐于使用容器化的方式来安装各类服务类软件,所以这里将尝试使用 Podman 来演示如何安装 Gogs。
Podman 和 Docker 区别不大,如果你使用 Docker,也可以作为参考。
首先在服务器上安装好 Podman 或是 Docker 运行环境,然后创建一个目录,用来挂载 Gogs 的仓库数据。
mkdir gogs
然后执行以下容器运行命令:
podman run --rm -it -p 2222:22 -p 8080:3000 -v $PWD/gogs:/data gogs/gogs
接下来在本地电脑上打开浏览器,输入服务器 IP:8080
格式的地址(IP 这两个字符请替换为自己服务器的实际 IP 地址),就可以看到 Gogs 的安装界面了:
根据提示输入配置信息,然后完成安装。接下来就是跟使用 GitHub 一样的流程:注册新用户,创建项目仓库,克隆到本地等,所有这些都是界面化操作。下面是我创建的一个测试项目主页截图。
使用 Gitea
上面的 Gogs 是一个由个人维护主导的开源项目。个人主导的项目在功能规划上难免会有自己喜好和取舍。当这种取舍和项目的其他贡献者存在冲突时,分道扬镳就在所难免了。Gitea 就是这么来的。所以 Gitea 源自 Gogs,只不过功能特性上更加丰富。
这种一脉相承的关系也延续到了安装和配置方式上。同样使用 Podman 容器化的安装方式,先创建好目录:
mkdir gitea
然后执行以下容器运行命令:
podman run --rm -it -p 2222:22 -p 8080:3000 -v $PWD/gitea:/data gitea/gitea
然后通过浏览器访问 IP:8080
来完成配置安装,操作过程和 Gogs 一样。下面是我完成用户注册和仓库项目创建后的截图:
使用 GitLab CE
Gitlab 是体验最接近 Github 的源码托管软件,同时也是一个「最重」的选择。这个「重」体现在软件的大小和硬件需求上,比如它的安装推荐内存是 4GB。
这里同样以容器化的方式来介绍它的安装过程。首先仍然是创建挂载目录:
mkdir etc log opt
然后运行以下容器命令:
podman run --rm -it \
-p 2222:22 -p 8080:80 \
-v $PWD/etc:/etc/gitlab \
-v $PWD/log:/var/log/gitlab \
-v $PWD/opt:/var/opt/gitlab \
gitlab gitlab/gitlab-ce
镜像有一个多 G 的大小,所以需要一点时间来完成下载。后续容器的启动也比较耗时,同样需要耐心。等启动完成,就可以通过 IP:8080
来访问服务首页了。
Gitlab 默认会创建一个 root
账号,初始密码位于 etc/initial_root_password
目录下。复制这个文件中 Password:
后的密码。然后用 root
账号登陆系统。
下面是我创建完一个测试项目后的截图:
如何选择
对于无需他人合作的个人项目,我会倾向于选择 SSH 的方式,这让我可以以最低的硬件成本达成源码托管服务的需求。在此之上,如果有团队配合和界面上的需要,我会倾向于选择 Gogs 和 Gitea。这两者之间的选择主要就是看自己的功能需求,优先考虑 Gogs,Gogs 没有的功能再考虑 Gitea。至于 Gitlab,其庞大的体积以及硬件要求,都不太契合我这种「抠门」的个人用户,所以在可预见的将来,都不会考虑使用。