github备份迁移

发布时间:2026/8/24 14:57:40

最新修改时间:暂无更新时间

11 min read

目录

前言

gitea项目及问题

博客流程增加

github仓库备份迁移

脚本

迁移善后

结尾

前言

本来只是没事干,想到之前刷过linux系统的机顶盒,于是便想搞点事做,那就是部署东西喽。


了解到了gitea,于是开始部署,由于我比较喜欢使用docker compose方式部署,所以那天我找了很久、很久,就为了找到armv7架构的镜像资源,幸运的是我找到了,然后就是部署成功。


然后又没事干了,于是我想着把github备份下来,把原先博客部署流程:本地电脑 → github仓库(+自动化)→ 服务器,改成本地电脑先 → gitea(局域网内的机顶盒),再接着走后续流程。

其实本来想省去github这一流程,但是机顶盒性能不够执行自动化流程,没法构建出dist,如果我用本地电脑先构建dist的话,那就大大的影响了我操作的体验


这其中遇到了一些问题:

包括但不限于:

  1. gitea变更无法推送到github
  2. 迁移github仓库至gitea失败
  3. ssh连通报错
  4. 等等等(由于当天没记录,所以不记得所有问题了,我学会了的大概略自动忘掉这个问题)

其中在迁移github仓库时,我用了脚本来进行,毕竟这个gitea没法批量迁移仓库,而且连接也时好时坏,所以我就用电脑做中转,再push到gitea

话不多说,go go go !

gitea项目及问题

包括用gitea做了什么,还有问题解决,反正我记得啥就写啥,大概率都是有用的!!!

博客流程增加

原先流程:

本地电脑typora编写 → push到github(自动化构建并推送) → 服务器,进而实现博客更新,不过由于使用了esa边缘加速,所以一般24小时全面更新博客

先fork到gitea

使用gitea自带的迁移镜像仓库功能

github的url使用http、token记得给够权限

可以单独创建一个完事后删掉,这里建议给所有权限,后续会用到省的你去思考

在这有个小提醒,记得把目标仓库设置公开可见,否则会失败!!!

后续在gitea设置里取消镜像仓库更改为普通仓库


------ 刚刚想起来上一篇文章写过了,这里不再赘述直接过去下一阶段 -------

github仓库备份迁移

就是把github的仓库整到gitea罢了,方式有很多,自行选择,不要怕麻烦,多尝试,学的多

目前:gitea部署完成、博客迁移完成、网络问题解决,只差仓库数据转移


操作准备事项:

  1. github所有权限token(懒得思考,所以所有权限,至于安全问题,你不丢失不会有)
  2. gitea令牌(gitea账户里生成,记得勾选所有权限)
  3. 电脑上装有git (方便拉取、推送,还有使用bash终端)
  4. ssh连接正常
  5. 把github所有仓库名检查一遍,禁止 —— - 等符号单独出现,还有空格!(把名字改英文数字正常些)
  6. 创建文件: /c/用户/用户名/migrate_single_repo.sh
脚本

根据下列代码进行修改,在终端只需要填入仓库名、github的token、gitea的token,这个脚本不要放token!

#!/usr/bin/env bash
# migrate_single_repo.sh - 修正版(Windows Git Bash / WSL) 建议bash没因为舒服
set -euo pipefail

GITHUB_OWNER="github用户名" 
# 修改成你的用户名

GITEA_API="http://192.168.31.46:3000/api/v1" 
# 改成你的gitea的api,这个是因为我的gitea部署在局域网内的机顶盒里

GITEA_OWNER="ahyun" 
# gitea账户的用户名

GITEA_SSH_BASE="ssh://git@192.168.31.46:222"   
# 不要尾部斜杠 你电脑通过ssh连接你的gitea,所以你需要修改地址端口

TMPDIR="${TMPDIR:-/tmp/gitea_migrate_test}"
mkdir -p "$TMPDIR"
echo "临时目录: $TMPDIR"

read -p "要测试迁移的仓库名(例如 repo-name): " REPO
# 去掉 Windows 回车符
REPO=$(printf "%s" "$REPO" | tr -d '\r' | tr -d '\n')
if [ -z "$REPO" ]; then
  echo "仓库名不能为空,退出"
  exit 1
fi

# 交互式安全读 token(不会回显)
read -s -p "请输入 GitHub token(仅用于本次会话): " GITHUB_TOKEN
echo
read -s -p "请输入 Gitea token(用于创建仓库;仅本次会话): " GITEA_TOKEN
echo

# 先检测 SSH & git 权限:用已知存在的仓库做检测(若无可跳过)这段你看情况,不建议有,因为这是我的仓库!!!
TEST_REPO="ahyun-s_love_island"
# 可以修改为你的github仓库名

if git ls-remote "${GITEA_SSH_BASE}/${GITEA_OWNER}/${TEST_REPO}.git" >/dev/null 2>&1; then
  echo "SSH & git 权限检测通过(可以访问 ${TEST_REPO})"
else
  echo "警告:SSH 或远端访问检测失败。若你先前已确认能用 ssh/key,请继续(推送可能仍然成功)。"
fi

# 1. clone --mirror(使用 token 的 https URL) 先拉取到本地电脑中转
CLONE_URL="https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_OWNER}/${REPO}.git"
REPO_DIR="${TMPDIR}/${REPO}.git"

echo "开始 git clone --mirror ..."
rm -rf "$REPO_DIR" || true

# 若网络不稳,可重试几次
CLONE_RETRIES=5
i=0
until git clone --mirror "$CLONE_URL" "$REPO_DIR"; do
  i=$((i+1))
  echo "git clone 失败(第 $i 次)。"
  if [ "$i" -ge "$CLONE_RETRIES" ]; then
    echo "多次尝试仍失败,请检查 token、仓库名或网络。保留临时目录 $REPO_DIR 供排错。"
    exit 2
  fi
  sleep $((i * 3))
done
echo "clone 完成,大小:"
du -sh "$REPO_DIR" || true

# 2. 在 Gitea 创建仓库(若不存在) 不要自己创建仓库,为了省事也为了后续直接去gitea查看脚本进度
echo "在 Gitea 上尝试创建仓库(若已存在将忽略)..."
CREATE_JSON=$(printf '{"name":"%s","private":false,"description":"Migrated test from GitHub/%s/%s"}' "$REPO" "$GITHUB_OWNER" "$REPO")
curl -s -X POST -H "Authorization: token ${GITEA_TOKEN}" -H "Content-Type: application/json" -d "$CREATE_JSON" "${GITEA_API}/user/repos" >/dev/null || true
echo "创建请求已发送(若已存在会被忽略或返回 409)"

# 3. push --mirror 到 Gitea
cd "$REPO_DIR"
GITEA_REMOTE="${GITEA_SSH_BASE}/${GITEA_OWNER}/${REPO}.git"
git remote remove gitea 2>/dev/null || true
git remote add gitea "$GITEA_REMOTE"
echo "开始 git push --mirror 到 $GITEA_REMOTE ..."
# 支持用户在当前终端通过 export GIT_SSH_COMMAND 来指定私钥/端口(已推荐)
if ! git push --mirror gitea; then
  echo "git push 失败,请检查 SSH key、Gitea 权限与网络。临时镜像保留在: $REPO_DIR"
  exit 3
fi
echo "push 成功"

# 4. 清理临时目录(按需)
echo -n "是否删除本次镜像临时目录 $REPO_DIR ? [y/N]: "
read ans
if echo "$ans" | grep -iq '^y'; then
  rm -rf "$REPO_DIR"
  echo "已删除"
else
  echo "已保留: $REPO_DIR (如需删除,运行 rm -rf \"$REPO_DIR\")"
fi

# 5. 清空变量,避免 token 留在环境
GITHUB_TOKEN=""
GITEA_TOKEN=""
unset GITHUB_TOKEN GITEA_TOKEN

echo "单仓测试完成。请在 Gitea 网页或通过 git ls-remote 检查仓库是否到位。"

接下里就是一个一个操作了,至于为什么不再写个脚本进行遍历批量操作,是因为意外问题很多,我可不想花很多时间查看日志找哪里错了,再说了,一遍又一遍的操作,你‘菜鸡’的更清楚!!!

迁移善后

主要是查看是否有自动化流程,小心被触发,还有想要从gitea变更后推送到对应gitea仓库,记得去仓库设置里找镜像设置,搞一波就行


在迁移中也许会出现ssh连通问题、拉取github仓库到本地中转问题、push到gitea问题、完成后删除临时文件夹和文件问题

  1. ssh连通这个以后我另外写一篇,这里不多赘述(急不急0.0) (ಥ _ ಥ)
  2. 拉取github仓库:要么token问题,要么网络问题,话说都会玩gitea、github了,这个应该没啥问题了吧
  3. push到gitea:只有你的ssh连通问题,网络肯定不会坏的,自己部署的网络还能坏?
  4. 遗留文件:直接去相应地址删掉即可,不想删那就留着

总的来说,就只有ssh连接这个一个问题,其他都是小case,我信你,你肯定能成功

结尾

最近连续更新这两篇文章,还有实操,确实有点累人,昨天找那个哪吒监控的镜像资源都找了很久,还好最后成功部署了

害,话说我为什么不能是有钱人呢,我就能买牛掰的设备,不怕性能的局限了,所有镜像资源都能随意找到。呜呜呜,穷鬼才是搞这东西的动力,随意找到了就不会珍惜了!!!

昨天部署了哪吒监控,改天我再更新,因为我的操作流程比较少有,我当时在网上找教程找的那是一塌糊涂。

还有ssh相关,这个等着吧,看看后续结果如何,毕竟我之前还欠了两三篇呢!!!

如果部署中有任何问题或疑惑建议先问ai,不行再留言,我会定期查看给予回复。