作者:小米和南瓜 | 来源:互联网 | 2023-05-17 17:12
在我的GitLab存储库中,我有一个包含20个项目的组.我想一次克隆所有项目.那可能吗?
1> 小智..:
这是Python 3中的一个例子:
from urllib.request import urlopen
import json
import subprocess, shlex
allProjects = urlopen("http://[yourServer:port]/api/v4/projects?private_token=[yourPrivateTokenFromUserProfile]&per_page=100000")
allProjectsDict = json.loads(allProjects.read().decode())
for thisProject in allProjectsDict:
try:
thisProjectURL = thisProject['ssh_url_to_repo']
command = shlex.split('git clone %s' % thisProjectURL)
resultCode = subprocess.Popen(command)
except Exception as e:
print("Error on %s: %s" % (thisProjectURL, e.strerror))
2> VonC..:
不是,除非:
你有一个第21个项目,它引用其他20个作为子模块.
(在这种情况下,克隆后跟a git submodule update --init
就足以克隆并检出所有20个项目)
或者以某种方式列出您有权访问的项目(项目的GitLab API),并循环该结果以克隆每个项目(意味着可以编写脚本,然后作为"一个"命令执行)
3> Benedikt..:
有一个名为myrepos的工具,它管理多个版本控制存储库.更新所有存储库只需要一个命令:
mr update
为了将所有gitlab项目注册到mr,这里有一个小的python脚本.它需要安装包python-gitlab:
import os
from subprocess import call
from gitlab import Gitlab
# Register a connection to a gitlab instance, using its URL and a user private token
gl = Gitlab('http://192.168.123.107', 'JVNSESs8EwWRx5yDxM5q')
groupsToSkip = ['aGroupYouDontWantToBeAdded']
gl.auth() # Connect to get the current user
gitBasePathRelative = "git/"
gitBasePathRelativeAbsolut = os.path.expanduser("~/" + gitBasePathRelative)
os.makedirs(gitBasePathRelativeAbsolut,exist_ok=True)
for p in gl.Project():
if not any(p.namespace.path in s for s in groupsToSkip):
pathToFolder = gitBasePathRelative + p.namespace.name + "/" + p.name
commandArray = ["mr", "config", pathToFolder, "checkout=git clone '" + p.ssh_url_to_repo + "' '" + p.name + "'"]
call(commandArray)
os.chdir(gitBasePathRelativeAbsolut)
call(["mr", "update"])
4> Jonas Gröger..:
我为此构建了一个脚本(curl,git,jq).我们使用它并且它工作得很好:https://gist.github.com/JonasGroeger/1b5155e461036b557d0fb4b3307e1e75
要找到您的命名空间,最好快速检查API:
curl "https://domain.com/api/v3/projects?private_token=$GITLAB_PRIVATE_TOKEN"
在那里,使用"namespace.name"作为NAMESPACE
您的组.
该脚本基本上做:
获取与您匹配的所有项目 PROJECT_SEARCH_PARAM
得到他们的path
和ssh_url_to_repo
2.1.如果目录path
存在,请进入并调用git pull
2.2.如果目录path
不存在,请致电git clone
5> pbuchheit..:
这是bash脚本的另一个示例,用于克隆组中的所有存储库。您需要安装的唯一依赖项是jq(https://stedolan.github.io/jq/)。只需将脚本放入要克隆项目的目录中即可。然后如下运行:
./myscript
即
./myscript group1 abc123tyn234 http://yourserver.git.com
脚本:
#!/bin/bash
if command -v jq >/dev/null 2>&1; then
echo "jq parser found";
else
echo "this script requires the 'jq' json parser (https://stedolan.github.io/jq/).";
exit 1;
fi
if [ -z "$1" ]
then
echo "a group name arg is required"
exit 1;
fi
if [ -z "$2" ]
then
echo "an auth token arg is required. See $3/profile/account"
exit 1;
fi
if [ -z "$3" ]
then
echo "a gitlab URL is required."
exit 1;
fi
TOKEN="$2";
URL="$3/api/v3"
PREFIX="ssh_url_to_repo";
echo "Cloning all git projects in group $1";
GROUP_ID=$(curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups?search=$1 | jq '.[].id')
echo "group id was $GROUP_ID";
curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups/$GROUP_ID/projects?per_page=100 | jq --arg p "$PREFIX" '.[] | .[$p]' | xargs -L1 git clone