有没有办法从下面的数据目录中恢复gitlab仓库?

ig9co6j1  于 2023-10-14  发布在  Git
关注(0)|答案(3)|浏览(126)

git-data中有类似project.a.git的仓库目录。我尝试将一个命名为.git,并在shell中输入“git status”,但得到“此操作必须在工作树中运行”。我没有备份tar文件,有没有办法从data目录恢复gitlab仓库?

csbfibhn

csbfibhn1#

  • 复制/移动存储库

我们想通过复制.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用户可以访问文件夹。
    注意:确保您对目录有读权限。
  • (可选)安装GitLab

由于GitLab安装现在可能已损坏。你需要perform a fresh install

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

#!/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
  • 我们可以使用glob获取所有的仓库:
"$src/@hashed"/*/*/*
  • 这包括.wiki.git目录,似乎包含项目的wiki。我们不需要这些,所以我们可以使用grep过滤掉任何不以.wiki.git结尾的(-v
printf "%s\n" "$src/@hashed"/*/*/* | grep -Pv '\.wiki\.git$'
  • 现在,我们将单独与每个存储库进行交互。
for repo in $(printf "%s\n" "$src/@hashed"/*/*/* | grep -Pv '\.wiki\.git$'); do
    # interact with each repo
done
  • 从仓库的config获取GitLab路径。
path=$(git config --file "$repo/config" --get gitlab.fullpath)
echo $path
# peilonrayz/repository
  • .git文件夹复制到本地存储库目录。
dest=/data/repositories
mkdir -p $dest/$path/.git
cd $dest/$path
cp -r $repo/* .git
git --work-tree . reset --hard HEAD
  • 将所有内容推送到新的GitLab服务器。
origin=ssh://$server/$path.git
git remote add origin "$origin"
git push -u origin --all
git push -u origin --tags

TL;DR

注意:如果您使用的是Windows;你需要run Bash on Windows

#!/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
kulphzqa

kulphzqa2#

实际的存储库位于git-data/repositories中。
理想情况下,您可以通过从backups目录导入备份来恢复整个GitLab安装。

n53p2ov0

n53p2ov03#

答案来自@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

相关问题