「Gogs」自建 Git 服务,与 GitHub 同步推送
如果你和我一样,平时会写一些小工具、学习笔记,甚至还会顺手把带密码的配置文件塞进仓库里,那你大概率也会有一个念头:并不是所有东西都想直接放到 GitHub 上。
我之前也用过 Gitea。它确实成熟、完整,界面和 GitHub 也很接近,但对我这种只是想随手托管几个小项目的人来说,多少还是显得有点重了。尤其是我并不需要 CI/CD、组织协作之类的功能,只想要一个轻量、稳定、占用低的 Git 服务。
于是我把目光转向了 Gogs。
它给我的第一感觉很直接:足够轻,足够简单,也足够适合个人使用。 更重要的是,配合 Git 本身的多推送地址能力,我们还可以做到:代码平时先推到自己的 Gogs,需要公开同步时再一起推送到 GitHub。
1. 为什么我会选择 Gogs#
对于一台 1C1G 的小机器来说,Gogs 的负担几乎可以忽略。界面和 GitHub 也比较接近,基本不用重新适应;而它又没有那么多我平时根本用不上的附加功能。
对我来说,Gogs 最合适的使用场景就是:
- 托管日常写的小项目
- 存放不想直接公开的代码和笔记
- 作为自己的私人 Git 中转站
如果你和我一样,更看重“能用、够轻、维护省心”,那 Gogs 的确很适合作为个人自建 Git 服务的选择。
2. 用 Docker 部署 Gogs#
Gogs 的部署非常简单,用 Docker Compose 基本十几分钟就能搞定。
2.1 创建目录#
先准备一个工作目录:
1mkdir -p ~/docker-projects/gogs2cd ~/docker-projects/gogs3mkdir -p data2.2 编写 docker-compose.yml#
在当前目录新建 docker-compose.yml:
1services:2 gogs:3 image: gogs/gogs:latest4 container_name: gogs5 restart: unless-stopped6 ports:7 - "127.0.0.1:10880:3000"8 - "10022:22"9 volumes:10 - ./data:/data11 environment:12 - RUN_CROND=true13 - BACKUP_INTERVAL=24h14 - BACKUP_RETENTION=7d2.3 启动服务#
然后执行:
1docker compose up -d启动完成后,在浏览器中打开 Gogs 的安装页面,按照向导完成初始化即可。Gogs 支持多种数据库,如果只是个人使用,按默认方式一路配置下去就够了。
首次注册的账号默认就是管理员账号,后面创建仓库、配置 SSH Key 等操作都可以在后台直接完成。
3. 让 Git 克隆和推送更顺手#
如果你把 SSH 服务映射到了非默认端口,比如上面示例里的 10022,那么仓库地址通常会变成这样:
1ssh://git@你的域名:10022/用户名/仓库.git这个地址当然能用,但每次手敲都比较麻烦。
所以我更推荐在本地 ~/.ssh/config 里加一个别名:
1Host mygit2 HostName 你的域名3 Port 100224 User git这样以后克隆仓库时,就可以直接写成:
1git clone mygit:用户名/仓库.git日常 push、pull 也都会顺手很多,用起来和 GitHub 基本没什么区别。
4. 优先用 GitHub 镜像到 Gogs 做备份#
这部分其实才是更适合长期使用的方案。
因为 Gogs 本身支持创建镜像仓库,可以直接把 GitHub 仓库镜像到 Gogs。这样 GitHub 继续作为主仓库使用,Gogs 则承担自托管备份的角色,本地仓库也只需要维护 GitHub 这一套主要 remote。
有些仓库我希望:
- 平时继续以 GitHub 作为主仓库
- 在自己的服务器上保留一份自托管备份
- 保持同一套本地仓库,不想额外维护双 push 配置
如果是这种需求,我更推荐直接用 GitHub → Gogs 的镜像仓库。


4.1 双 push 作为备选项#
如果你希望在每次本地推送时,同时把代码发到 GitHub 和 Gogs,那么也可以给同一个 origin 配置多个 pushurl,把双 push 作为备选方案。
4.2 假设你有两个远程地址#
GitHub 仓库地址:
1git@github.com:你的用户名/项目名.gitGogs 仓库地址:
1git@你的Gogs域名:用户名/项目名.git4.3 先清理旧的 pushurl#
如果之前已经改过推送地址,建议先清空,避免配置混乱:
1git config --unset-all remote.origin.pushurl4.4 添加两个推送地址#
然后分别添加 GitHub 和 Gogs:
1git remote set-url --add --push origin git@github.com:你的用户名/项目名.git2git remote set-url --add --push origin git@你的Gogs域名:用户名/项目名.git4.5 检查配置是否生效#
执行:
1git remote -v你应该能看到类似下面这样的结果:
1origin git@github.com:你的用户名/项目名.git (fetch)2origin git@github.com:你的用户名/项目名.git (push)3origin git@你的Gogs域名:用户名/项目名.git (push)这里的意思是:
fetch仍然从 GitHub 拉取push时会同时推送到 GitHub 和 Gogs
当然,如果你更希望默认从 Gogs 拉取,也可以反过来设置 fetch 地址。
4.6 之后怎么推送#
配置完成后,日常直接执行:
1git push或者指定当前分支:
1git push origin main都可以同时推送到两个远程地址。
5. 这套方案适合什么人#
如果你需要的是完整的团队协作、权限体系、CI/CD 流程,甚至还要接各种插件和企业功能,那 Gitea 或 GitLab 显然更适合。
但如果你和我一样:
- 只想托管自己的项目
- 希望资源占用尽量低
- 有些内容不想直接公开
- 又想保留同步到 GitHub 的能力
那 GitHub + Gogs 镜像备份 这套组合会更省心。
它不花哨,也没有太多复杂概念,但正因为足够简单,反而特别适合个人开发者长期使用。
写在最后#
这次从 Gitea 换到 Gogs,并不是因为 Gitea 不好,而是因为我想要的东西其实很明确:
一个更轻量的自托管 Git 服务,以及一套能兼顾私有存储和公开同步的工作流。
Gogs 刚好满足了这一点。
部署快、占用低、上手简单,再加上 Gogs 自带的镜像仓库能力,用来给 GitHub 做一份自托管备份也很合适。即使你不想用镜像仓库,Git 自带的多推送配置也能作为备选。对于 VPS 资源有限、又想把代码掌握在自己手里的用户来说,这确实是一种很舒服的方案。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分内容可能已过时
评论区
分享你的想法,与大家交流讨论
音乐
暂未播放