Bitbucket klont alle Team-Repositories

Lesezeit: 9 Minuten

Benutzeravatar von Imran
Imran

Ich möchte alle meine Bitbucket-Team-Repositories mit einem Bash-Skript und http klonen. Ich habe einige Beispiele gefunden, die die Bitbucket-API verwenden, aber sie scheinen alle keine Repositories zurückzugeben. Irgendwelche Ideen? Mac verwenden.

  • Sind Sie überhaupt authentifiziert? Und hat der Benutzer, als der Sie sich authentifizieren, Zugriff auf die Team-Repositories? Wenn nicht, empfehle ich Ihnen, ein App-Passwort einzurichten (at bitbucket.org/account/user//app-passwords), das über ausreichende Berechtigungen verfügt (Lesezugriff auf Konto/Teammitgliedschaft/Projekte/Repositorys sollte die meisten Dinge abdecken, die Sie benötigen).

    – JVDL

    8. November 2016 um 4:46 Uhr

Benutzeravatar von Nikolay Galkin
Nikolai Galkin

Hier ist meine einfache Lösung. Datei erstellen downloader.sh

#!/bin/bash

USER=${1}
TEAM=${2}

rm -rf "$TEAM" && mkdir "$TEAM" && cd $TEAM

NEXT_URL="https://api.bitbucket.org/2.0/repositories/${TEAM}?pagelen=100"

while [ ! -z $NEXT_URL ] && [ $NEXT_URL != "null" ]
do
    curl -u $USER $NEXT_URL > repoinfo.json
    jq -r '.values[] | .links.clone[1].href' repoinfo.json > ../repos.txt
    NEXT_URL=`jq -r '.next' repoinfo.json`

    for repo in `cat ../repos.txt`
    do
        echo "Cloning" $repo
        if echo "$repo" | grep -q ".git"; then
            command="git"
        else
            command="hg"
        fi
        $command clone $repo
    done
done

cd ..

Sie können es ausführen durch:

sh downloader.sh username teamname # or username instead team name

  • Warnung: Sie werden alle 100 Repos nach einem Passwort gefragt

    – Chill Appreciator

    28. Dezember 2021 um 14:52 Uhr

  • @chillappreciator verwendet kein http-Protokoll. Verwenden Sie das git@-Protokoll und ssh-Schlüssel.

    – Nikolai Galkin

    3. Januar um 8:03

  • Das funktioniert gut, aber wenn Bitbucket weniger als 100 Repos hat, fragt mich das Skript nach dem Herunterladen aller Repos, sagen wir nur 6, erneut nach einem Passwort, und wenn ich es eingebe, wird das Skript es tun Löschen Sie alle zuvor heruntergeladenen Ordner (Natürlich könnte ich Strg-C drücken und alles wäre in Ordnung). Ich habe versucht, pagelen=2 festzulegen, und dieses Verhalten tritt nicht mehr auf.

    – DAB

    28. Januar um 9:09 Uhr


  • Lösung für meinen obigen Kommentar: Ändern Sie die While-Schleife, um nach $NEXT_URL zu suchen!= “null” ……….. while [ ! -z $NEXT_URL ] && [ $NEXT_URL != “null” ]

    – DAB

    28. Januar um 9:20 Uhr

  • Danke für das Skript. Kleiner Nachtrag: Bitbucket hat aufgehört, Benutzername+Passwort als Authentifizierungsmethode zu verwenden. Damit Ihr Skript funktioniert, müssen Sie ein App-Passwort erstellen und verwenden username:apppassword wie username in Ihrer Befehlszeile. Der Benutzername befindet sich in den Kontoeinstellungen. Die Verwendung von E-Mail-Adresse mit App-Passwort führt zu einer Fehlermeldung.

    – GenError

    4. Oktober um 12:56 Uhr

Benutzeravatar von Eric Nord
Eric Nord

Stellen Sie sicher, dass Sie Ihre SSH-Schlüssel in Bitbucket eingerichtet haben und Git installiert ist, indem Sie ein Repo manuell klonen:

Dadurch werden alle Repos geklont, die Ihnen gehören:

USER=bitbucket_username; curl --user ${USER} https://api.bitbucket.org/2.0/repositories/${USER} | grep -o '"ssh:[^ ,]\+' | xargs -L1 git clone

Um Ihre Team-Repositories zu sichern, verwenden Sie dasselbe Skript, aber codieren Sie Ihren Bitbucket-Teamnamen wie folgt:

USER=bitbucket_username; curl --user ${USER} https://api.bitbucket.org/2.0/repositories/TEAMNAME | grep -o '"ssh:[^ ,]\+' | xargs -L1 git clone

Hier ist ein besserer Weg:

curl -u ${1} https://api.bitbucket.org/1.0/users/TEAMNAME > repoinfo

for repo_name in `cat repoinfo | sed -r 's/("name": )/\n\1/g' | sed -r 's/"name": "(.*)"/\1/' | sed -e 's/{//' | cut -f1 -d\" | tr '\n' ' '`
do
    echo "Cloning " $repo_name
    git clone [email protected]:TEAMNAME/$repo_name.git
    echo "---"
done

  • Nur für diejenigen, die versuchen, dies zu verwenden. Stelle sicher das ssh: ist die richtige Signatur für Ihr Repository. Für mich war es git:. Siehe so: USER=myUserName; curl --user ${USER} https://api.bitbucket.org/2.0/repositories/THETEAM | grep -o '"git@[^ ,]\+' | xargs -L1 git clone

    – Mark Odey

    16. Februar 2019 um 1:32 Uhr

  • in meinem mac habe ich heruntergeladen gsed und ersetzt sed mit gsed im Code

    – Shaig Khaligli

    21. April 2019 um 0:46 Uhr

Eine weitere Alternative mit jq.

#!/bin/bash

user=username:password

curl -u $user 'https://api.bitbucket.org/2.0/user/permissions/teams?pagelen=100' > teams.json

jq -r '.values[] | .team.username' teams.json > teams.txt

for team in `cat teams.txt`
do
  echo $team

  rm -rf "${team}"

  mkdir "${team}"

  cd "${team}"

  url="https://api.bitbucket.org/2.0/repositories/${team}?pagelen=100"

  echo $url

  curl -u $user $url > repoinfo.json

  jq -r '.values[] | .links.clone[0].href' repoinfo.json > repos.txt

  for repo in `cat repos.txt`
  do
    echo "Cloning" $repo
    git clone $repo
  done

  cd ..

done

  • Ich konnte dies nicht mit username:password zum Laufen bringen, aber es funktionierte gut mit a --netrc-file. Ich bin mir nicht sicher, ob ich jedes Mal das gesamte Teamverzeichnis löschen soll … wahrscheinlich ist es besser, neue Änderungen einzufügen, aber es ist nicht trivial, das Skript dafür zu aktualisieren.

    – mp

    25. August 2019 um 20:56 Uhr


Benutzeravatar von simpleuser
einfacher Benutzer

Sie können nur einen einfachen Befehl verwenden, wenn Sie weniger als 100 Repositories haben und ‘pagelen=100’ zur Abfrage hinzufügen, da dies das meiste ist, was die Bitbucket-API auf einmal meldet. Wenn Sie über mehr als 100 Repositories verfügen, müssen Sie den „Next“-Link im zurückgegebenen JSON verarbeiten, um die URL zum Abfragen des nächsten Satzes von Repositories zu erhalten, was mit einem Skript einfacher wäre.

Wenn Sie anstelle von ssh http zum Klonen verwenden, müssen Sie entweder das Passwort für geschützte Repositories eingeben oder sich ein Bitbucket-App-Passwort besorgen und die URLs ändern, um es einzufügen, damit sie so aussehen:

https://bitbucketuserhere:[email protected]/teamorusername/repositoryname.git

Außerdem werden beim Klonen nicht alle Versionen von Git-LFS-Dateien abgerufen, seien Sie sich dessen also bewusst. Verwenden Sie laut Bitbucket „git lfs fetch –all“, um alle LFS-Dateiversionen lokal zu kopieren.

Um die Liste Ihrer persönlichen Repositories abzurufen, verwenden Sie eine URL wie:

https://api.bitbucket.org/2.0/repositories/BITBUCKETUSERNAME?pagelen=100

Um die Liste Ihrer Team-Repositories abzurufen, verwenden Sie eine URL wie diese, um die Liste aller Repositories abzurufen, bei denen Sie Mitglied sind:

https://api.bitbucket.org/2.0/repositories/TEAMNAME?pagelen=100&role=member

Das Folgende ist ein Beispiel für ein Perl-Skript, das Sie verwenden könnten, um Kopien Ihrer Repositories zu klonen und dann zu verwalten, indem Sie http anstelle von ssh zum Abrufen verwenden. Es erstellt –mirror-Klone anstelle einer vollständig bestückten Arbeitskopie (perfekt zum Verschieben oder zur Notfallwiederherstellung). Es tut nicht Sichern Sie alle LFS-Dateien.

#!/usr/bin/env perl

use warnings;
use strict;
use JSON::Parse 'parse_json';

# CONFIGURATION:
# Bitbucket team or user name to get list of repositories from
my $teamORuserName = "myteam";

# Bitbucket app password with access to query the API for the
# list of repositories. Format: "user-name:app-token"
my $appPassword= "frank-james:LAYDxtc8H6FGKUZeHEef";

#------------------------------------------------------------------------------

my $nextPageLink = "https://api.bitbucket.org/2.0/repositories/$teamORuserName?pagelen=100&role=member";
while (defined $nextPageLink)
{
    $nextPageLink =~ m/page=(\d+)/;
    print "Fetching page " . ($1 || 1). "\n";
    my $response = `curl -q --silent --request GET --user '$appPassword' '$nextPageLink'`;
    my $json = parse_json($response);
    my $values = $json->{values};

    foreach my $repo (@$values)
    {
        die "'$repo->{name}' is not a 'git' repo: $repo->{scm}" unless $repo->{scm} eq "git";
        my $links = $repo->{links} || die "no links data for '$repo->{name}'";
        my $clones = $links->{clone} || die "no clone data for '$repo->{name}'";
        my $url = $clones->[0]->{href} || die "no clone url found for $repo->{name}";

        # use uuid as directory name, to survive project name changes
        my $uuid = $repo->{uuid}; $uuid =~ s/[\{\}]//g;
        if (not -e $uuid)
        {
            print "cloning '$repo->{name}' into $uuid\n";
            # replace user name with token to avoid password prompts
            $url =~ s|(https?://).+(\@bitbucket.org)|$1$appPassword$2|;
            system("git clone --progress --mirror '$url' $uuid") == 0 or die "clone failed";
            # make a human friendly link to current repository name
            symlink $uuid, $repo->{slug} or warn "symlink failed: $!";
        }
        else
        {
            print "updating '$repo->{name}' in $uuid\n";
            system("cd $uuid && git fetch --all --tags --prune") == 0 or die "fetch failed";
        }
        print "\n";
    }

    $nextPageLink = $json->{next};
}
exit 0;

Hier ist ein Python-Skript zum Klonen aller Repositories des Teams oder Benutzers in Bitbucket. Da die Team-Repositorys normalerweise privat sind, habe ich mich darum gekümmert, während ich die Bitbucket-API verwendet habe. Geben Sie also einfach Ihren Bitbucket-Benutzernamen, Ihr Passwort und den Benutzernamen des Teams ein und es kümmert sich um das Klonen des gesamten Team-Repositorys für Sie.

import subprocess
import json

cmd = "curl -u <bitbucket_username>:<bitbucket_password>  https://api.bitbucket.org/2.0/repositories/<team_name_or_project_name>"
cmd = cmd.split()

while 1:
    from_api = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    from_api = from_api.communicate()
    json_from_api = json.loads(from_api[0])
    for unit_dict in json_from_api["values"]:
        clone_cmd = "git clone " + unit_dict["links"]["clone"][1]["href"]
        clone_cmd = clone_cmd.split()
        clone_out = subprocess.call(clone_cmd, shell=False)
    if "next" not in json_from_api:
        break
    else:
        cmd[-1] = json_from_api["next"]

Aufbauend auf der Antwort von @eric-nord habe ich sed durch ersetzt jq um zum Repo-Slug zu gelangen (was ich einfacher fand, wenn man bedenkt, dass Bitbucket json ausgibt).

Wenn Sie also weniger als 100 Repositories haben und die Repositories für ein bestimmtes Projekt klonen möchten, sollte das folgende Shell-Skript ausreichen.

#!/usr/bin/env sh

if [ $# -eq 0 ] || [ "$1" == "-?" ] || [ "$1" == "--help" ] || [ "$1" == "-h" ]
  then
    echo "Usage: `basename $0` <URL> <USERNAME> <PROJECTNAME>"
    echo "e.g. `basename $0` bitbucket_url some_user some_project"
    exit 1
fi

curl -u ${2} https://${1}/rest/api/1.0/projects/${3}/repos?limit=100 > repos.json

for repo_name in `cat repos.json | jq -r '.values[] .slug'`
do
  echo "cloning" $repo_name
  git clone https://${2}@${1}/scm/${3}/$repo_name.git ./${3}/$repo_name
done

Benutzeravatar von Gladwin Henald
Gladwin Henald

Hier ist ein Knotenskript zum Herunterladen aller Repositories in einem Bitbucket-Konto. Bitte vergessen Sie nicht, die erforderlichen npm-Pakete hinzuzufügen.

const argv = require('yargs').argv
const request = require('request');
const nodegit = require('nodegit');

let repos = [];
let opts = {
    fetchOpts: {
        callbacks: {
            credentials: function() {
                return nodegit.Cred.userpassPlaintextNew(argv.username, argv.password);
            },
            certificateCheck: function() {
                return 1;
            }
        }
    }
};

function cloneRepository(index) {
    let repo = repos[index];
    console.log('Cloning ' + repo.full_name);
    nodegit.Clone(repo.links.clone[0].href, 'repositories/' + repo.full_name, opts)
    .then(function(repo) {
        if (repos.length - 1 == index) {
            console.log("All repositories cloned");
        } else {
            cloneRepository(index + 1);
        }
    })
    .catch(function(err) {
        if (err) {
            console.log(err);
        }
    });
}

function loadRepositories(url) {
    request.get(url, {
        'auth': {
            'user': argv.username,
            'pass': argv.password
        }
    }, function (err, response, body) {
        if (err) return console.log(err);
        let data = JSON.parse(body);
        for (var i = 0; i < data.values.length; i++) {
            repos.push(data.values[i]);
        }
        if (data.next){
            loadRepositories(data.next);    
        } else if (repos.length > 0) {
            console.log('Started cloning..');
            cloneRepository(0);
        } else {
            console.log("No repositories found");
        }
    });
}

if (argv.username && argv.password) {
    console.log('Loading all repositories..');
    loadRepositories('https://api.bitbucket.org/2.0/repositories/?role=member');
} else {
    console.log('Please specify both the --username and --password options');
}

Sie können sich auch dieses GitHub-Repository ansehen. Bitbucket-Repository-Downloader

  • Das OP fragt nach Bash. Das sieht nicht nach BASH-Code aus.

    – Stephan Rauch

    14. Juli 2018 um 1:50 Uhr

  • @StephenRauch, Eric hat bereits die Antwort für das Bash-Skript geliefert. Meine Antwort könnte für einige andere Leute nützlich sein, die nach der Implementierung von nodejs suchen.

    – Gladwin Henald

    14. Juli 2018 um 7:57 Uhr

1429390cookie-checkBitbucket klont alle Team-Repositories

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy