「Gogs」自建 Git 服务,与 GitHub 同步推送

1583 字
8 分钟
「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 创建目录#

先准备一个工作目录:

Terminal window
mkdir -p ~/docker-projects/gogs
cd ~/docker-projects/gogs
mkdir -p data

2.2 编写 docker-compose.yml#

在当前目录新建 docker-compose.yml

services:
gogs:
image: gogs/gogs:latest
container_name: gogs
restart: unless-stopped
ports:
- "127.0.0.1:10880:3000"
- "10022:22"
volumes:
- ./data:/data
environment:
- RUN_CROND=true
- BACKUP_INTERVAL=24h
- BACKUP_RETENTION=7d

2.3 启动服务#

然后执行:

Terminal window
docker compose up -d

启动完成后,在浏览器中打开 Gogs 的安装页面,按照向导完成初始化即可。Gogs 支持多种数据库,如果只是个人使用,按默认方式一路配置下去就够了。

首次注册的账号默认就是管理员账号,后面创建仓库、配置 SSH Key 等操作都可以在后台直接完成。


3. 让 Git 克隆和推送更顺手#

如果你把 SSH 服务映射到了非默认端口,比如上面示例里的 10022,那么仓库地址通常会变成这样:

ssh://git@你的域名:10022/用户名/仓库.git

这个地址当然能用,但每次手敲都比较麻烦。

所以我更推荐在本地 ~/.ssh/config 里加一个别名:

Host mygit
HostName 你的域名
Port 10022
User git

这样以后克隆仓库时,就可以直接写成:

Terminal window
git 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 仓库地址:

git@github.com:你的用户名/项目名.git

Gogs 仓库地址:

git@你的Gogs域名:用户名/项目名.git

4.3 先清理旧的 pushurl#

如果之前已经改过推送地址,建议先清空,避免配置混乱:

Terminal window
git config --unset-all remote.origin.pushurl

4.4 添加两个推送地址#

然后分别添加 GitHub 和 Gogs:

Terminal window
git remote set-url --add --push origin git@github.com:你的用户名/项目名.git
git remote set-url --add --push origin git@你的Gogs域名:用户名/项目名.git

4.5 检查配置是否生效#

执行:

Terminal window
git remote -v

你应该能看到类似下面这样的结果:

origin git@github.com:你的用户名/项目名.git (fetch)
origin git@github.com:你的用户名/项目名.git (push)
origin git@你的Gogs域名:用户名/项目名.git (push)

这里的意思是:

  • fetch 仍然从 GitHub 拉取
  • push 时会同时推送到 GitHub 和 Gogs

当然,如果你更希望默认从 Gogs 拉取,也可以反过来设置 fetch 地址。

4.6 之后怎么推送#

配置完成后,日常直接执行:

Terminal window
git push

或者指定当前分支:

Terminal window
git push origin main

都可以同时推送到两个远程地址。


5. 这套方案适合什么人#

如果你需要的是完整的团队协作、权限体系、CI/CD 流程,甚至还要接各种插件和企业功能,那 Gitea 或 GitLab 显然更适合。

但如果你和我一样:

  • 只想托管自己的项目
  • 希望资源占用尽量低
  • 有些内容不想直接公开
  • 又想保留同步到 GitHub 的能力

GitHub + Gogs 镜像备份 这套组合会更省心。

它不花哨,也没有太多复杂概念,但正因为足够简单,反而特别适合个人开发者长期使用。


写在最后#

这次从 Gitea 换到 Gogs,并不是因为 Gitea 不好,而是因为我想要的东西其实很明确:

一个更轻量的自托管 Git 服务,以及一套能兼顾私有存储和公开同步的工作流。

Gogs 刚好满足了这一点。

部署快、占用低、上手简单,再加上 Gogs 自带的镜像仓库能力,用来给 GitHub 做一份自托管备份也很合适。即使你不想用镜像仓库,Git 自带的多推送配置也能作为备选。对于 VPS 资源有限、又想把代码掌握在自己手里的用户来说,这确实是一种很舒服的方案。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

「Gogs」自建 Git 服务,与 GitHub 同步推送
https://www.chaxuji.de/posts/gogs-self-hosted-git-sync-github/
作者
Liebesfreud
发布于
2026-05-05
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Liebesfreud
思绪正飘过无人航行过的海
嗨!欢迎来到我的博客!
安静地待一会儿吧。这里存放着我的思绪,和一些散落的片段,想知道更多吗?
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
25
分类
6
标签
33
总字数
38,241
运行时长
0
最后活动
0 天前
文章热力图
年共发布0篇文章
1 2 3 4 5 6 7 8 9 10 11 12

文章目录

已进入沉浸阅读模式,按 ESC 退出