web-dev-qa-db-fra.com

Script shell permettant de cloner tous les dépôts d'une organisation github

J'ai une liste de repo d'organisation normale de curl response avec la commande ci-dessous:

curl "https://api.github.com/orgs/[organization]/repos?access_token=[access_token]"

Le résultat de cette commande est énorme. Je souhaite extraire chaque paramètre clone_url du référentiel, passer en boucle sur ces URL et exécuter git clone dessus.

Ci-dessous, un aperçu d’une entrée de la JSON sortie curl me donne:

[
  {
    "id": 42059877,
    "name": "customrepo",
    "full_name": "SampleOrg/customrepo",
    "owner": {
      "login": "SampleOrg",
      "id": 14164701,
      "avatar_url": "https://avatars1.githubusercontent.com/u/14164701?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/SampleOrg",
      "html_url": "https://github.com/SampleOrg",
      "followers_url": "https://api.github.com/users/SampleOrg/followers",
      "following_url": "https://api.github.com/users/SampleOrg/following{/other_user}",
      "gists_url": "https://api.github.com/users/SampleOrg/gists{/Gist_id}",
      "starred_url": "https://api.github.com/users/SampleOrg/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/SampleOrg/subscriptions",
      "organizations_url": "https://api.github.com/users/SampleOrg/orgs",
      "repos_url": "https://api.github.com/users/SampleOrg/repos",
      "events_url": "https://api.github.com/users/SampleOrg/events{/privacy}",
      "received_events_url": "https://api.github.com/users/SampleOrg/received_events",
      "type": "Organization",
      "site_admin": false
    },
    "private": true,
    "html_url": "https://github.com/SampleOrg/customrepo",
    "description": null,
    "fork": false,
    "url": "https://api.github.com/repos/SampleOrg/customrepo",
    "forks_url": "https://api.github.com/repos/SampleOrg/customrepo/forks",
    "keys_url": "https://api.github.com/repos/SampleOrg/customrepo/keys{/key_id}",
    "collaborators_url": "https://api.github.com/repos/SampleOrg/customrepo/collaborators{/collaborator}",
    "teams_url": "https://api.github.com/repos/SampleOrg/customrepo/teams",
    "hooks_url": "https://api.github.com/repos/SampleOrg/customrepo/hooks",
    "issue_events_url": "https://api.github.com/repos/SampleOrg/customrepo/issues/events{/number}",
    "events_url": "https://api.github.com/repos/SampleOrg/customrepo/events",
    "assignees_url": "https://api.github.com/repos/SampleOrg/customrepo/assignees{/user}",
    "branches_url": "https://api.github.com/repos/SampleOrg/customrepo/branches{/branch}",
    "tags_url": "https://api.github.com/repos/SampleOrg/customrepo/tags",
    "blobs_url": "https://api.github.com/repos/SampleOrg/customrepo/git/blobs{/sha}",
    "git_tags_url": "https://api.github.com/repos/SampleOrg/customrepo/git/tags{/sha}",
    "git_refs_url": "https://api.github.com/repos/SampleOrg/customrepo/git/refs{/sha}",
    "trees_url": "https://api.github.com/repos/SampleOrg/customrepo/git/trees{/sha}",
    "statuses_url": "https://api.github.com/repos/SampleOrg/customrepo/statuses/{sha}",
    "languages_url": "https://api.github.com/repos/SampleOrg/customrepo/languages",
    "stargazers_url": "https://api.github.com/repos/SampleOrg/customrepo/stargazers",
    "contributors_url": "https://api.github.com/repos/SampleOrg/customrepo/contributors",
    "subscribers_url": "https://api.github.com/repos/SampleOrg/customrepo/subscribers",
    "subscription_url": "https://api.github.com/repos/SampleOrg/customrepo/subscription",
    "commits_url": "https://api.github.com/repos/SampleOrg/customrepo/commits{/sha}",
    "git_commits_url": "https://api.github.com/repos/SampleOrg/customrepo/git/commits{/sha}",
    "comments_url": "https://api.github.com/repos/SampleOrg/customrepo/comments{/number}",
    "issue_comment_url": "https://api.github.com/repos/SampleOrg/customrepo/issues/comments{/number}",
    "contents_url": "https://api.github.com/repos/SampleOrg/customrepo/contents/{+path}",
    "compare_url": "https://api.github.com/repos/SampleOrg/customrepo/compare/{base}...{head}",
    "merges_url": "https://api.github.com/repos/SampleOrg/customrepo/merges",
    "archive_url": "https://api.github.com/repos/SampleOrg/customrepo/{archive_format}{/ref}",
    "downloads_url": "https://api.github.com/repos/SampleOrg/customrepo/downloads",
    "issues_url": "https://api.github.com/repos/SampleOrg/customrepo/issues{/number}",
    "pulls_url": "https://api.github.com/repos/SampleOrg/customrepo/pulls{/number}",
    "milestones_url": "https://api.github.com/repos/SampleOrg/customrepo/milestones{/number}",
    "notifications_url": "https://api.github.com/repos/SampleOrg/customrepo/notifications{?since,all,participating}",
    "labels_url": "https://api.github.com/repos/SampleOrg/customrepo/labels{/name}",
    "releases_url": "https://api.github.com/repos/SampleOrg/customrepo/releases{/id}",
    "deployments_url": "https://api.github.com/repos/SampleOrg/customrepo/deployments",
    "created_at": "2015-09-07T15:15:41Z",
    "updated_at": "2016-01-18T18:35:00Z",
    "pushed_at": "2017-08-21T18:23:26Z",
    "git_url": "git://github.com/SampleOrg/customrepo.git",
    "ssh_url": "[email protected]:SampleOrg/customrepo.git",
    "clone_url": "https://github.com/SampleOrg/customrepo.git",
    "svn_url": "https://github.com/SampleOrg/customrepo",
    "homepage": null,
    "size": 4682,
    "stargazers_count": 0,
    "watchers_count": 0,
    "language": "PHP",
    "has_issues": true,
    "has_projects": true,
    "has_downloads": true,
    "has_wiki": true,
    "has_pages": false,
    "forks_count": 0,
    "mirror_url": null,
    "archived": false,
    "open_issues_count": 0,
    "forks": 0,
    "open_issues": 0,
    "watchers": 0,
    "default_branch": "master",
    "permissions": {
      "admin": false,
      "Push": true,
      "pull": true
    }
  },
...

Comment puis-je faire cela dans un script Shell avec peut-être un tableau ou une boucle for?

Tout ce que j’ai essayé, c’est le code suivant, qui lit le fichier texte ligne par ligne et clone les référentiels, mais pour créer ce fichier texte, il est nécessaire d’effectuer un traitement préalable pour le filtrage de clone_url param-values, mais je vouloir sauter cette partie entièrement si possible.

while read p; do
    #echo $p
    git clone $p
done < Orgname_Repos.txt
2
Vicky Dev

Voici:

#!/bin/bash
for i in $(curl "https://api.github.com/orgs/[organization]/repos?access_token=[access_token]" | sed '/[ ]*"clone_url":/!d;s/[^:]*: "//;s/",$//'); do
  echo git clone $i
done

Cela affichera une liste des commandes git clone à exécuter, si vous êtes content, supprimez simplement echo pour le lancer.

7
dessert