git-data中有project.a.git这样的仓库目录。我尝试将其中一个命名为 .git,并在 shell 中输入“git status”,但得到“此操作必须在工作树中运行”。 我没有备份 tar 文件,有什么方法可以从数据目录恢复 gitlab 存储库吗?
复制/移动存储库
我们希望通过复制 .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 安装现在可能已损坏。您需要执行全新安装。
注意:您将需要重新创建要导入的任何组。您可以使用以下脚本找到需要创建的所有组。
#!/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 过滤掉任何不 (-v
) 以 .wiki.git
结尾的内容
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
注意:如果您使用的是 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
答案来自@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