批量导入仓库到gitlab(自托管)
Batch import repositories to gitlab (self-hosted)
我有大约 50 个 git 存储库要导入到 GitLab 实例中。它们不在 GitHub/GitLab/whatever 中,而是由于 SVN git 转换而位于我的硬盘上。
将它们全部导入的好方法是什么?
我正在考虑在 Java/Python/...已经内置了使这项任务更容易的东西。
最好的办法是为此使用一个简单的脚本。好消息是,您只需将项目推送到您拥有创建存储库的适当权限的名称空间即可创建项目。
例如,您可以这样创建一个新项目:
git remote add origin ssh://git@gitlab.example.com/mynamespace/my-newproject.git
git push -u origin --all
您将看到您的 GitLab 实例回复以下消息,表明项目已创建:
remote:
remote: The private project mynamespace/my-newprojct was successfully created.
remote:
remote: To configure the remote, run:
remote: git remote add origin git@gitlab.example.com:mynamespace/my-newprojct.git
remote:
remote: To view the project, visit:
remote: https://gitlab.example.com/mynamespace/my-newproject
remote:
假设您有一个有效的(最好是无密码的)SSH 配置,存储库名称可以安全地用于项目 slug(没有空格、特殊字符等)和包含转换后的存储库的平面结构,例如:
/path/to/converted/repos
├── my-great-repo1
├── my-great-repo2
在 Python 中,像这样的东西应该可以工作...
import os
import subprocess
from typing import Generator, Tuple
# change these values
GITLAB_NAMESPACE = "gitlab.example.com/mynamespace"
CONVERTED_REPOS_ROOT = "/path/to/converted/repos"
def iter_git_repos(root) -> Generator[Tuple[str, str], None, None]:
for name in os.listdir(root):
path = os.path.join(root, name)
if not os.path.isdir(path):
continue # skip files
git_directory = os.path.join(path, ".git")
if not os.path.exists(git_directory):
continue # skip directories that are not git repos
yield name, path
for name, path in iter_git_repos(CONVERTED_REPOS_ROOT):
os.chdir(path)
origin_url = f"ssh://git@{GITLAB_NAMESPACE}/{name}.git"
# set the remote (use `set-url` instead of `add` if an origin already exists)
subprocess.run(["git", "remote", "add", "origin", origin_url], check=True)
# push all branches
subprocess.run(["git", "push", "-u", "origin", "--all"], check=True)
# push all tags
subprocess.run(["git", "push", "-u", "origin", "--tags"], check=True)
最后,我使用gitlab-rake 导入存储库:
https://docs.gitlab.com/ee/raketasks/import.html
我将服务器上的存储库复制到一个专用目录中,将所有者更改为 git
用户和组,并且 运行:
gitlab-rake gitlab:import:repos["/var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")"]
我有大约 50 个 git 存储库要导入到 GitLab 实例中。它们不在 GitHub/GitLab/whatever 中,而是由于 SVN git 转换而位于我的硬盘上。
将它们全部导入的好方法是什么?
我正在考虑在 Java/Python/...已经内置了使这项任务更容易的东西。
最好的办法是为此使用一个简单的脚本。好消息是,您只需将项目推送到您拥有创建存储库的适当权限的名称空间即可创建项目。
例如,您可以这样创建一个新项目:
git remote add origin ssh://git@gitlab.example.com/mynamespace/my-newproject.git
git push -u origin --all
您将看到您的 GitLab 实例回复以下消息,表明项目已创建:
remote:
remote: The private project mynamespace/my-newprojct was successfully created.
remote:
remote: To configure the remote, run:
remote: git remote add origin git@gitlab.example.com:mynamespace/my-newprojct.git
remote:
remote: To view the project, visit:
remote: https://gitlab.example.com/mynamespace/my-newproject
remote:
假设您有一个有效的(最好是无密码的)SSH 配置,存储库名称可以安全地用于项目 slug(没有空格、特殊字符等)和包含转换后的存储库的平面结构,例如:
/path/to/converted/repos
├── my-great-repo1
├── my-great-repo2
在 Python 中,像这样的东西应该可以工作...
import os
import subprocess
from typing import Generator, Tuple
# change these values
GITLAB_NAMESPACE = "gitlab.example.com/mynamespace"
CONVERTED_REPOS_ROOT = "/path/to/converted/repos"
def iter_git_repos(root) -> Generator[Tuple[str, str], None, None]:
for name in os.listdir(root):
path = os.path.join(root, name)
if not os.path.isdir(path):
continue # skip files
git_directory = os.path.join(path, ".git")
if not os.path.exists(git_directory):
continue # skip directories that are not git repos
yield name, path
for name, path in iter_git_repos(CONVERTED_REPOS_ROOT):
os.chdir(path)
origin_url = f"ssh://git@{GITLAB_NAMESPACE}/{name}.git"
# set the remote (use `set-url` instead of `add` if an origin already exists)
subprocess.run(["git", "remote", "add", "origin", origin_url], check=True)
# push all branches
subprocess.run(["git", "push", "-u", "origin", "--all"], check=True)
# push all tags
subprocess.run(["git", "push", "-u", "origin", "--tags"], check=True)
最后,我使用gitlab-rake 导入存储库:
https://docs.gitlab.com/ee/raketasks/import.html
我将服务器上的存储库复制到一个专用目录中,将所有者更改为 git
用户和组,并且 运行:
gitlab-rake gitlab:import:repos["/var/opt/gitlab/git-data/repository-import-$(date "+%Y-%m-%d")"]