Git 仓库在内网与 Gitee 间迁移及同步记录
在软件开发过程中,常常会遇到需要将代码仓库进行迁移或同步的情况。近期我就碰到了要把 Gitee 代码仓库移植到内网代码仓库,并且后续还得进行同步的需求。这里把整个过程记录下来,方便以后自己参考,也希望能帮助到有同样需求的朋友。
一、将 Gitee 仓库移植到内网仓库
1. 克隆 Gitee 仓库到本地
首先,我们需要在本地克隆 Gitee 仓库,并且要使用--mirror
选项,这样才能确保克隆所有内容,包括提交日志、标签等。在终端中执行以下命令:
git clone --mirror https://gitee.com/yourusername/your-repository.git
记得把https://gitee.com/yourusername/your-repository.git
替换成你实际的 Gitee 仓库地址。
2. 在内网代码仓库创建新仓库
接着,在内网代码仓库平台(比如 GitLab、Gitea 等)创建一个新的空仓库,创建完成后要记住该仓库的地址。
3. 推送本地镜像仓库到内网仓库
进入刚刚本地克隆的仓库目录,使用git push
命令将本地镜像仓库推送到内网仓库:
cd your-repository.git
git push --mirror <内网仓库地址>
这里的<内网仓库地址>
要替换为你在内网代码仓库平台创建的新仓库地址。
二、后续同步操作
(一)有外网连接时
1. 从 Gitee 仓库同步更新到内网仓库
手动同步:适用于更新不频繁的情况。定期执行以下操作:
# 进入本地克隆的镜像仓库目录
cd your-repository.git
# 从Gitee仓库拉取最新更新
git fetch origin
# 将拉取到的更新推送到内网仓库
git push --mirror <内网仓库地址>
自动化同步 :对于更新频繁的场景,可以使用脚本结合定时任务来实现。比如下面这个简单的 Python 脚本,再利用cron
等定时任务工具定期执行:
import subprocess
# 定义本地仓库路径和内网仓库地址
local\_repo\_path = 'your-repository.git'
internal\_repo\_url = '<内网仓库地址>'
# 进入本地仓库目录
subprocess.run(\['cd', local\_repo\_path], shell=True)
# 从Gitee仓库拉取最新更新
subprocess.run(\['git', 'fetch', 'origin'], cwd=local\_repo\_path)
# 将拉取到的更新推送到内网仓库
subprocess.run(\['git', 'push', '--mirror', internal\_repo\_url], cwd=local\_repo\_path)
记得把your-repository.git
替换为本地克隆的镜像仓库目录,<内网仓库地址>
替换为实际的内网仓库地址。
2. 从内网仓库同步更新到 Gitee 仓库
操作步骤与从 Gitee 同步到内网类似:
手动同步:
# 进入本地克隆的镜像仓库目录
cd your-repository.git
# 从内网仓库拉取最新更新
git fetch <内网仓库地址别名>
# 将拉取到的更新推送到Gitee仓库
git push --mirror \<Gitee仓库地址>
这里的<内网仓库地址别名>
是在本地仓库中为内网仓库设置的别名(一般在添加远程仓库时指定),<Gitee仓库地址>
是 Gitee 上原仓库的地址。
自动化同步:同样可以编写 Python 脚本结合定时任务实现,示例如下:
import subprocess
# 定义本地仓库路径、Gitee仓库地址和内网仓库地址
local\_repo\_path = 'your-repository.git'
gitee\_repo\_url = '\<Gitee仓库地址>'
internal\_repo\_url = '<内网仓库地址>'
# 进入本地仓库目录
subprocess.run(\['cd', local\_repo\_path], shell=True)
# 从内网仓库拉取最新更新
subprocess.run(\['git', 'fetch', internal\_repo\_url], cwd=local\_repo\_path)
# 将拉取到的更新推送到Gitee仓库
subprocess.run(\['git', 'push', '--mirror', gitee\_repo\_url], cwd=local\_repo\_path)
将your-repository.git
替换为本地克隆的镜像仓库目录,<Gitee仓库地址>
替换为 Gitee 上原仓库的地址,<内网仓库地址>
替换为实际的内网仓库地址。
(二)内网无外网连接时
1. 使用移动存储设备同步
从 Gitee 克隆仓库到可联网的机器:在能访问互联网的机器上,执行克隆命令:
git clone --mirror https://gitee.com/yourusername/your-repository.git
将克隆的仓库复制到移动存储设备:把克隆下来的仓库文件夹复制到 U 盘等移动存储设备。
将仓库复制到内网机器:把 U 盘连接到内网机器,将仓库文件夹复制到内网机器指定目录。
在内网机器上推送仓库到内网代码仓库:在复制到内网机器的仓库目录下,执行推送命令:
cd your-repository.git
git push --mirror <内网仓库地址>
后续更新同步,重复上述步骤即可。不过要注意使用移动存储设备时的数据安全性,避免数据泄露或感染病毒。
2. 通过中间服务器中转同步
准备中间服务器:准备一台既能访问互联网,又能与内网通信的中间服务器。
在中间服务器上克隆 Gitee 仓库:在中间服务器上执行克隆命令:
git clone --mirror https://gitee.com/yourusername/your-repository.git
定期从 Gitee 仓库拉取更新 :在中间服务器上,定期执行git fetch
命令拉取最新更新:
cd your-repository.git
git fetch origin
配置中间服务器与内网代码仓库的通信:确保中间服务器能访问内网代码仓库,并配置好身份验证信息(如 SSH 密钥、用户名和密码等)。
将更新推送到内网代码仓库:在中间服务器上,执行推送命令:
git push --mirror <内网仓库地址>
也可以编写脚本结合定时任务工具(如 Linux 上的cron
)实现自动化同步,Python 脚本示例如下:
import subprocess
# 定义本地仓库路径和内网仓库地址
local\_repo\_path = 'your-repository.git'
internal\_repo\_url = '<内网仓库地址>'
# 进入本地仓库目录
subprocess.run(\['cd', local\_repo\_path], shell=True)
# 从Gitee仓库拉取最新更新
subprocess.run(\['git', 'fetch', 'origin'], cwd=local\_repo\_path)
# 将拉取到的更新推送到内网仓库
subprocess.run(\['git', 'push', '--mirror', internal\_repo\_url], cwd=local\_repo\_path)
将your-repository.git
替换为本地克隆的镜像仓库目录,<内网仓库地址>
替换为实际的内网仓库地址。同时要注意,通过中间服务器中转同步时,要保障中间服务器的安全性,防止数据泄露和恶意攻击。
经过这次实践,对 Git 仓库的迁移和同步有了更深入的理解,希望这些记录能在未来再次遇到类似问题时派上用场。