批量将gitlab仓库转移到gitea中

news/2025/2/26 17:44:14

前言

单位有一个机器,机器里是个vm esxi里面跑着一个虚拟机里面跑着一个gitlab,经历了岁月变迁,网改了一遍,办公室改了一遍,机器折腾来折腾去,可能闪到腰了吧,gitlab总是访问不到,寻思吧库都导出来迁移到另一个机器里,另一个机器里面是gitea,现在这个虚拟机已经访问不大了,一拷贝数据磁盘就找不到。。只好换了个机器,插着这块硬盘,但是网络问题连不上虚拟机。干脆手动迁移吧(好几百个库呢。。。)

注意:只能导出来Git仓库,不能导出其他东西

将数据拷贝出来

使用vm esx控i制台登录虚拟机(本来想直连的,结果网不行,转不过去)跳转到/var/opt/gitlab/git-data将其拷出来cp -d /var/opt/gitlab/git-data ~/gitBack(必须加-d 否则有软连接后续无法使用)
此时发生了一件事,磁盘有500G。。而我没地方存。。于是关机,给虚拟机加了一个20g的硬盘,根据网上的教程挂载上去,把数据拷贝过去,然后打开vm的ssh,登录,找到当时加的那快硬盘,拷贝到本地电脑里

整理文件

使用7zip打开vmdk(这玩意真牛B。DG都打不开这个居然可以)解压到某处
此时的结构是xxxxx下有好几个子库,,如android_app.git其下是这些
在这里插入图片描述
这里跟gitea是一样的,但是外层目录结构不一样,所以得改一下,gitlab名称是可以加好多/的但是gitea不行,拿脚本创建新目录,把之前导出来的数据压扁成这样
xxxxx_android_app\.git
以下脚本在xxxxx的上一层使用

$d = Resolve-Path ../
$outPath = "$d" + "\outGitRpos\"
New-Item -ItemType Directory -Path $outPath
Get-ChildItem | foreach {
	# Set-Location $_.Name
	$base_path_name = $_.Name
	Get-ChildItem -Path $_.Name | foreach {
		$path_name = $base_path_name + "\" + $_.Name
		$path_name2 = $base_path_name + "_" + $_.Name
		# 名字中去除.git
		$new_path_name = $path_name2 -replace ".git",""
		Write-Output $path_name\*		
		Write-Output $outPath$new_path_name\.git
		# 按新规则创建文件夹和其下.git文件夹
		New-Item -ItemType Directory -Path $outPath$new_path_name\.git
		# 复制文件到里面
		Copy-Item $path_name\* $outPath$new_path_name\.git -Recurse
	}
}

执行脚本后找上一层outGitRpos其下都是整理好的仓库每个文件夹里都有一个.git文件夹,此时是无法还原文件的,因为.git里的config文件不对,需要更改
创建一个config文件,写下以下内容

[core]
	bare = false
	repositoryformatversion = 0
	filemode = false
	symlinks = false
	ignorecase = true
	logallrefupdates = true

outGitRpos文件夹下执行第二个脚本,修改每个文件夹下的config

Get-ChildItem -Directory | foreach {
	$path = "$_" + "\.git"
	Write-Output $path
	Copy-Item -Force config $path
}

新问题

此时又出现了一个问题。仓库没有名字。不知道是什么项目,只好进去拿命令跑出备份,
gitlab-rake gitlab:backup:create
像以前一样拷贝出来,解压,找到db,找到,根据不同数据库类型自行寻找导入方法,执行一下sql查出一个json,复制出后再前后加上[]去除最后一个逗号,留下备用

select replace(b.path, '/', '_'), concat('{ "name": "',replace(b.path, '/', '_'),'", "description": "', a.description,'" },') from projects a left join routes b on b.source_id = a.id and source_type = 'Project'

gitea_62">gitea接口

http://192.168.1.220:3000/api/swagger 接口文档
http://192.168.1.220:3000/swagger.v1.json 导入接口文档
找个apifox用json那个导入进去
或者按需拿脚本调用
auth改成basic auth输入用户名密码,
post /user/repos 创建仓库
body json

{
    "name": "项目名",
    "description": "描述",
    "private": true
}

默认将仓库创建到登录用户名下
post /repos/{owner}/{repo}/transfer转入仓库(我要将所有项目转移到组织里)

owner: 仓库转让的所有者
repo: 要转移的仓库名称

body json

{
    "new_owner": "创建的组织名(英文命名)"
}

想办法拼接上面jsonlist循环调用这两个接口,gitea的事就完了
我用的apifox调用的,写的自动化测试,可以用自己熟悉的脚本语言跑

最后一哆嗦

outGitRpos执行,将仓库上传到gitea

Get-ChildItem -Directory | foreach {
	$path = "$_"
	#Write-Output $path
	# git checkout
	# 恢复文件
	#Start-Process cmd.exe -ArgumentList "/k cd /d $path & git checkout"
	# 恢复文件并更改仓库地址并推送
	Start-Process cmd.exe -ArgumentList "/k cd /d $path & git remote add origin http://192.168.1.220:3000/oldProjects/$path.git & git push -u origin master"
}

脚本跑完手动检查一下是否有错误,有的仓库是空的,没有文件,直接就失败了。忽略就行

完结


http://www.niftyadmin.cn/n/5869005.html

相关文章

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 主机代理 配置

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 主机代理 配置 前言整体思路安装 WSL2Windows 环境升级为 WIN11 专业版启用window子系统及虚拟化 安装WSL2通过 Windows 命令提示符安装 WSL安装所需的 Linux 发行版(如 Ubuntu 20.04)查看…

对比 Vue 中的 defineAsyncComponent 和 React 中的 lazy

Vue3 的 defineAsyncComponent 和 React 的 lazy 都是用于实现组件懒加载的核心 API,但两者在实现机制、功能扩展和应用场景上存在显著差异。 一、底层原理对比 1. Vue3 defineAsyncComponent 实现方式: 基于 Vue 的响应式系统和组件生命周期管理。通过…

C# 根据Ollama+DeepSeekR1开发本地AI辅助办公助手

在上一篇《访问DeepSeekR1本地部署API服务搭建自己的AI办公助手》中,我们通过通过Ollama提供的本地API接口用Python实现了一个简易的AI办公助手,但是需要运行Py脚本,还比较麻烦,下面我们用C#依据Ollama提供的API接口开发一个本地A…

设计模式|结构型模式总结

1. 介绍 结构型设计模式(Structural Patterns) 主要关注类与对象的组合,以提高代码的灵活性和可维护性。这些模式帮助创建更大结构,同时保持代码的低耦合性。 结构型设计模式包括以下七种: 适配器模式(Ad…

如何让传统制造企业从0到1实现数字化突破?

随着全球制造业不断向智能化、数字化转型,传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新,更是管理、文化、业务流程等全方位的变革。从零开始,如何带领一家传统制造企业走向数字化突破,是许多企业领导者面…

多线程进阶 : 八股文面试题 一 [Java EE 多线程 锁和死锁相关问题]

目录 锁策略: 1. 乐观锁 vs 悲观锁 2. 轻量级锁 vs 重量级锁 3. 自旋锁 vs 挂起等待锁 4. 公平锁 vs 非公平锁 5. 可重入锁 vs 不可重入锁 6. 读写锁 vs 互斥锁 Java中 synchronized 内部实现策略 (内部原理) Java中的synchronized具体采用了哪些锁策略呢? 死锁相关 …

DeepSeek05-大模型WebUI

一、说明: 将DeepSeek部署到前台Web界面的方法主要有以下几种推荐方案,涵盖开源工具、第三方客户端及特定场景适配方案: Open WebUIChatbox AICherry StudioSillyTavern 二、Open WebUI 安装配置教程 特点:Open WebUI 是一个开…

The First项目报告:MyShell开启AI创作经济新纪元

随着加密货币和区块链技术的不断发展,MyShell作为一个前瞻性的Web3 AI平台,迅速崭露头角。MyShell致力于通过去中心化的方式,将AI技术与区块链相结合,为全球创客社区提供一个开放、模块化的AI应用生态。2025年2月25日,…