有什么方法可以像下面这样从数据目录恢复gitlab存储库吗?

问题描述 投票:0回答:3

git-data中有project.a.git这样的仓库目录。我尝试将其中一个命名为 .git,并在 shell 中输入“git status”,但得到“此操作必须在工作树中运行”。 我没有备份 tar 文件,有什么方法可以从数据目录恢复 gitlab 存储库吗?

git gitlab recovery
3个回答
3
投票
  1. 复制/移动存储库
    我们希望通过复制 .git 文件夹来制作 GitLab 数据的副本以进行恢复。 由于您的 GitLab 服务器可能位于远程服务器上,因此您可以使用

    scp
    通过 SSH 进行复制。

    • 远程GitLab

      src=~/gitlab
      server=server.local
      
      mkdir -p "$src"
      scp -r "$server:/var/opt/gitlab/git-data/repositories/@hashed" "$src"
      
    • 本地GitLab

      src=~/gitlab
      server=
      
      mkdir -p "$src"
      cp -r /var/opt/gitlab/git-data/repositories/@hashed "$src"
      

    请务必更改;

    • server.local
      到您服务器的域名或 IP 地址,并且
    • /var/opt/gitlab
      指向 GitLab 数据的路径。 如果您使用 Docker,则需要 从安装说明中调用您的位置。您可能需要以 root 身份登录,或让非 root 用户可以访问这些文件夹。

    注意:确保您具有对目录的读取权限。

  2. (可选)重新安装 GitLab
    由于 GitLab 安装现在可能已损坏。您需要执行全新安装

    注意:您将需要重新创建要导入的任何组。您可以使用以下脚本找到需要创建的所有组。

    #!/bin/bash
    
    src=~/gitlab
    
    repos() {
        for repo in $(printf "%s\n" "$src/@hashed"/*/*/* | grep -Pv '\.wiki\.git$'); do
            readarray -d "/" -t segments <<< $(git config --file "$repo/config" --get gitlab.fullpath)
            echo ${segments[0]}
        done
    }
    
    repos | sort | uniq
    
  3. 我们可以使用 glob 获取所有存储库:

    "$src/@hashed"/*/*/*
    
  4. 这包括

    .wiki.git
    目录,这些目录似乎包含项目的 wiki。 我们不需要这些,所以我们可以使用 grep 过滤掉任何不 (
    -v
    ) 以
    .wiki.git

    结尾的内容
    printf "%s\n" "$src/@hashed"/*/*/* | grep -Pv '\.wiki\.git$'
    
  5. 现在我们将分别与每个存储库进行交互。

    for repo in $(printf "%s\n" "$src/@hashed"/*/*/* | grep -Pv '\.wiki\.git$'); do
        # interact with each repo
    done
    
  6. 从存储库的

    config
    获取GitLab路径。

    path=$(git config --file "$repo/config" --get gitlab.fullpath)
    echo $path
    # peilonrayz/repository
    
  7. .git
    文件夹复制到本地存储库目录。

    dest=/data/repositories
    mkdir -p $dest/$path/.git
    cd $dest/$path
    cp -r $repo/* .git
    
  8. 恢复项目目录下的文件

    git --work-tree . reset --hard HEAD
    
  9. 将所有内容推送到新的 GitLab 服务器。

    origin=ssh://$server/$path.git
    git remote add origin "$origin"
    git push -u origin --all
    git push -u origin --tags
    

TL;博士

注意:如果您使用的是 Windows;您需要在 Windows 上运行 Bash

#!/bin/bash

# Change to your values
data=/var/opt/gitlab
src=~/gitlab
dest=/data/repositories
server=server.local

mkdir -p "$src"
scp -r "$server:$data/git-data/repositories/@hashed" "$src"
ssh "$server"  # reinstall GitLab

for repo in $(printf "%s\n" "$src/@hashed"/*/*/* | grep -Pv '\.wiki\.git$'); do
    path=$(git config --file "$repo/config" --get gitlab.fullpath)
    origin=ssh://$server/$path.git

    mkdir -p $dest/$path/.git
    cd $dest/$path
    cp -r $repo/* .git
    git --work-tree . reset --hard HEAD
    if [ "$server" != "" ]; then
        git remote add origin "$origin"
        git push -u origin --all
        git push -u origin --tags
    fi
done

0
投票

实际的存储库位于

git-data/repositories

理想情况下,您可以通过从 backups 目录导入备份来

恢复
整个 GitLab 安装。


0
投票

答案来自@Peilonrayz,但我仍然必须进行一些尝试和错误才能在本地获取我的存储库,因此这里以简短格式表示:

#!/bin/bash

src=./data/git-data/repositories
dst=./gitlab-repos_bk

for repo in $(printf "%s\n" "$src/@hashed"/*/*/* | grep -Pv '\.wiki\.git$'); do
    # interact with each repo
    path=$(git config --file "$repo/config" --get gitlab.fullpath)
    echo path: $path
    echo repo: $repo
    mkdir -p $dst/$path/.git
    cp -r $repo/* $dst/$path/.git
    git -C $dst/$path --work-tree . reset --hard HEAD
done
© www.soinside.com 2019 - 2024. All rights reserved.