手动操作

本文档的主要参考资料是官方文档[1],操作期间也参考了一些博文[2]。由于我的GitLab是使用docker-compose搭建的容器化环境,以下操作需要在容器环境中进行:

docker exec -it $(docker ps | grep gitlab | awk '{print $1}') bash

首先在GitLab目录下创建导入目录:

su - git -c bash
mkdir -p /var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")/<optional_groupname>/<optional_subgroup>

其中,<optional_groupname>是你希望该项目所在的项目组名称,<optional_subgroup>是子项目组名称,支持多层嵌套。例如,如果我们有一个项目pjt-a,我们希望将来在GitLab中访问它的层级为grp-a/grp-aa/pjt-a,那么上面命令中就要预先创建repository-import-$(date "+%Y-%m-%d")/grp-a/grp-aa/这样的目录结构。

然后从原Git仓库获得bare repository [3],方法如下:

git clone --bare /path/to/pjt-a

这样我们就获得了一个名为pjt-a.git的目录,将该目录复制到GitLab所在容器中的上述路径:

docker cp /path/to/pjt-a.git $(docker ps | grep gitlab | awk '{print $1}'):/var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")/<optional_groupname>/<optional_subgroup>/

修改一下目录拥有者:

docker exec -it $(docker ps | grep gitlab | awk '{print $1}') bash # 进入容器
chown -R git:git /var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")/<optional_groupname>/<optional_subgroup>/

最后执行导入即可:

gitlab-rake gitlab:import:repos["/var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")"]

自动化

目前提供一个半自动化的脚本。首先人工将需要批量导入的仓库放在GitLab容器的/var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")路径下(方便起见可以直接在宿主机上使用容器所在根目录的绝对路径复制过去),导入工作开始前,该目录下的结构应为:

.
└── grp-a
    ├── grp-aa
        ├── grp-aaa
            ├── pjt-a
    ├── grp-ab
    ...

然后进入到容器内部,执行以下脚本即可:

#!/bin/bash

cd /var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")

for top_grp in $( ls . ); do
        cd $top_grp

        for mid_grp in $( ls . ); do
                cd $mid_grp

                for sub_grp in $( ls . ); do
                        cd $sub_grp

                        for repo in $( ls .); do
                                echo "[*] processing $top_grp/$mid_grp/$sub_grp/$repo"
                                git clone --bare $repo
                                rm -rf $repo
                        done

                        cd .. &> /dev/null
                done

                cd .. &> /dev/null
        done

        cd .. &> /dev/null
done

echo "[*] changing ownership to git"
chown -R git:git /var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")

echo "[*] importing repositories"
gitlab-rake gitlab:import:repos["/var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")"]

参考文献

  1. https://docs.gitlab.com/ee/raketasks/import.html
  2. https://skyao.gitbooks.io/learning-git/content/gitlab/import-exist-repository.html
  3. https://www.geeksforgeeks.org/bare-repositories-in-git/