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.
Bitbucket klont alle Team-Repositories
Imran
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
wieusername
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
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 esgit:
. 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 ersetztsed
mitgsed
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
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
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
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