gitlab服务器在没有备份的情况下宕机,如何恢复项目代码

发布时间 2023-11-06 13:01:22作者: 1156740846

第一步:复制旧服务器的代码仓库数据

将宕机的gitlab服务器硬盘挂载到其他服务器,打开挂载的磁盘,找到gitlab代码仓库目录  

/run/media/root/c6e4af86-0ca5-4841-8593-914811388435/var/opt/gitlab/git-data
黄色部分是磁盘挂载的目录,后面的 /var/opt/gitlab/git-data 这个是gitlab代码仓库的目录
打包 git-data 文件夹
tar -cvf git-data.tar git-data

拷贝 git-data.tar 到新的 github服务器,并解压到新的服务器

tar -xvf git-data.tar git-data333 

第二步:提取代码库中的项目信息

git-data下的目录名称是hash后的数字,已经看不出哪个文件夹是哪个项目的数据,但是文件夹下有个config文件,打开可以看到项目信息

 

 fullpath后面的信息就是  项目的组名称 / 项目的项目名称,那接下来只需要遍历每个文件夹,去读取文件夹下的config文件,就能获取到所有项目信息

1、提取所有git文件夹目录

dir /b /s *.git > 2.txt

2、使用java代码遍历代码仓库中的所有文件夹,提取所有config文件中的项目信息

    public static void main(String[] args) throws IOException {
        String path1 = "E:\\tools\\github\\git-data\\repositories\\@hashed";
        String fileName = "\\config";

        for (String path2 : path2Arr) {
            List<String> lines = Files.readAllLines(Paths.get(path1 + path2 + fileName), StandardCharsets.UTF_8);
            lines.forEach(line -> {
                if (line.contains("fullpath = ")) {
                    line = line.replaceAll("\\s", "").replace("fullpath=", "");
                    System.out.print(path2 + "\t");
                    System.out.println(line);
                }
            });
        }

    }

这样就得到文件夹对应的项目信息了

第三步:搭建新的 github 服务器

在新的服务器上,安装旧服务器上相同版本的 github (避免版本不同,数据无法镜像的问题)

# 准备工作
sudo yum update -y
sudo yum install curl openssh-server openssh-clients postfix cronie -y
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

# 安装服务
sudo yum install gitlab-ce -y

# 修改gitlab访问地址
sudo vim /etc/gitlab/gitlab.rb

# 重新加载配置文件
sudo gitlab-ctl reconfigure

# 启动服务
sudo gitlab-ctl start

# 关闭服务
sudo gitlab-ctl stop

 第四步:在新的gitlab服务器中添加空的项目

根据提取到的 组名称 和 项目名称 在新的gitlab中 创建组、创建空的项目,并把创建的空项目的git url 复制到表格中

这样就得到了代码仓库文件夹和空项目url一一对应的数据

 

 第五步:使用镜像功能恢复GitHub数据

 遍历表格中的数据,执行下方命令,将代码仓库文件夹中的数据镜像到新的gitlab空项目中,至此,gitlab数据的恢复就完成了

cd /var/opt/gitlab/git-data333/repositories/@hashed/代码仓库文件夹
git push --mirro 空项目url