Comment cloner tous les projets d'un groupe à la fois dans GitLab?

dans mon dépôt GitLab, j'ai un groupe avec 20 projets. Je veux cloner tous les projets à la fois. Est-ce possible?

28
demandé sur Doon 2015-03-17 15:46:01

6 réponses

Pas vraiment, sauf si:

7
répondu VonC 2018-07-01 10:00:09

voici un exemple en Python 3:

from urllib.request import urlopen
import json
import subprocess, shlex

allProjects     = urlopen("http://[yourServer:port]/api/v3/projects/all?private_token=[yourPrivateTokenFromUserProfile]")
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))
19
répondu Hot Diggity 2018-01-30 10:32:02

j'ai construit un script (curl, git, jq requis) juste pour ça. On l'utilise et il fonctionne très bien: https://gist.github.com/JonasGroeger/1b5155e461036b557d0fb4b3307e1e75

pour trouver votre espace de noms, il est préférable de vérifier rapidement L'API:

curl "https://domain.com/api/v3/projects?private_token=$GITLAB_PRIVATE_TOKEN"

là, utilisez " namespace.nom " comme NAMESPACE pour votre groupe.

Le script fait essentiellement:

  1. Obtenez tous les projets qui correspondent à votre PROJECT_SEARCH_PARAM
  2. Obtenir leur path et ssh_url_to_repo

    2.1. Si le répertoire path il existe, cd et appeler git pull

    2.2. Si le répertoire path n'existe pas, appelez git clone

7
répondu Jonas Gröger 2016-12-08 02:51:43

il y a un outil appelé myrepos, qui gère plusieurs versions contrôle les dépôts. La mise à jour de tous les dépôts exige simplement une commande:

mr update

afin d'enregistrer tous les projets gitlab auprès de mr, voici un petit script python. Il nécessite le paquet python-gitlab installé:

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"])
5
répondu Benedikt 2015-12-26 19:40:49

voici un autre exemple de script bash pour cloner toutes les repos dans un groupe. La seule dépendance que vous devez installer est jq (https://stedolan.github.io/jq/). Placez simplement le script dans le répertoire dans lequel vous voulez cloner vos projets. Puis l'exécuter comme suit:

./myscript <group name> <private token> <gitlab url>

i.e.

./myscript group1 abc123tyn234 http://yourserver.git.com

Script:

#!/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 "" ]
  then
    echo "a group name arg is required"
    exit 1;
fi

if [ -z "" ]
  then
    echo "an auth token arg is required. See /profile/account"
    exit 1;
fi

if [ -z "" ]
  then
    echo "a gitlab URL is required."
    exit 1;
fi

TOKEN="";
URL="/api/v3"
PREFIX="ssh_url_to_repo";

echo "Cloning all git projects in group ";

GROUP_ID=$(curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups?search= | 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
4
répondu pbuchheit 2017-03-02 21:19:02

Vous pouvez vous référer à ce script ruby ici: https://gist.github.com/thegauraw/da2a3429f19f603cf1c9b3b09553728b

mais vous devez vous assurer que vous avez le lien vers l'url de l'organisation gitlab (qui ressemble à:https://gitlab.example.com/api/v3/ par exemple organisation) et le jeton privé (qui ressemble à: QALWKQFAGZDWQYDGHADS et vous pouvez entrer:https://gitlab.example.com/profile/account Une fois que vous êtes connecté). Aussi ne assurez-vous que vous avez httparty gem installé ou gem install httparty

2
répondu thegauraw 2016-05-06 05:22:59