web-dev-qa-db-ja.com

GitHubからすべてのリポジトリを一度にクローンする方法は?

会社のGitHubアカウントを持っているので、自動化のために作成される可能性のある新しいものをすべて考慮して、内部のすべてのリポジトリをバックアップします。私はこのようなものを望んでいた:

git clone [email protected]:company/*.git 

または同様のものが動作しますが、そこにワイルドカードが好きではないようです。

Gitにクローンを作成し、適切なアクセス許可があると仮定してすべてをプルする方法はありますか?

77
numb3rs1x

そのようにするのは不可能だと思います。最善の策は、APIを使用して組織のリポジトリのリストを見つけてループすることです。

これを試して:

  • [アカウント設定]-> [アプリケーション]に移動してAPIトークンを作成します
  • http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}を呼び出します
  • 応答はオブジェクトのJSON配列になります。各オブジェクトには、その組織の下のリポジトリの1つに関する情報が含まれます。あなたの場合、ssh_urlプロパティを特に探していると思います。
  • 次に、git cloneこれらの各ssh_urls。

少し手間がかかりますが、GitHubで適切な認証が必要です。

39
Thomas Kelley

WindowsおよびすべてのUNIX/LINUXシステムで、Git Bashまたはその他のターミナルYOURUSERNAMEをユーザー名に置き換えて使用:

CNTX={users|orgs}; NAME={username|orgname}; PAGE=1
curl "https://api.github.com/$CNTX/$NAME/repos?page=$PAGE&per_page=100" |
  grep -e 'git_url*' |
  cut -d \" -f 4 |
  xargs -L1 git clone

すべてのリポジトリをダウンロードするには、CNTX=usersおよびNAME=yourusernameを設定します。 CNTX = orgsおよびNAME = yourorgnameを設定して、組織のすべてのリポジトリをダウンロードします。

最大ページサイズは100なので、すべてのリポジトリを取得するには、適切なページ番号でこれを数回呼び出す必要があります(ダウンロードしたいページ番号にPAGEを設定します)。

上記を行うシェルスクリプトを次に示します。 https://Gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e

95
Erdinc Ay

組織リポジトリ

組織からすべてのリポジトリを複製するには、次のシェルワンライナーを試してください。

GHORG=company; curl "https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone

ユーザーリポジトリ

GitリポジトリーURLを使用したすべてのクローン:

GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone

クローンURLを使用したすべてのクローン:

GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -w clone_url | grep -o '[^"]\+://.\+.git' | xargs -L1 git clone

ユーザーのスタートアップファイルに追加できる便利なシェル関数を次に示します( curl + jq を使用):

# Usage: gh-clone-user (user)
gh-clone-user() {
  curl -sL "https://api.github.com/users/$1/repos?per_page=1000" | jq -r '.[]|.clone_url' | xargs -L1 git clone
}

プライベートリポジトリ

プライベートリポジトリのクローンを作成する必要がある場合は、ヘッダーにAuthorizationトークンを追加できます。

-H 'Authorization: token <token>'

または、パラメータ(?access_token=TOKEN)で渡します。例:

curl -s "https://api.github.com/users/$GHUSER/repos?access_token=$GITHUB_API_TOKEN&per_page=1000" | grep -w clone_url | grep -o '[^"]\+://.\+.git' | xargs -L1 git clone

ノート:

  • プライベートリポジトリのみを取得するには、type=privateをクエリ文字列に追加します。
  • 別の方法は、APIキーを設定した後に hub を使用することです。

こちらもご覧ください:


ヒント
-速度を上げるには、xargs-Pパラメーターを指定して、並列プロセスの数を設定します(-P4 = 4プロセス)。
-GitHubの制限を引き上げる必要がある場合は、APIキーを指定して認証を試みてください。
---recursiveを追加して登録済みサブモジュールに再帰し、内部のネストされたサブモジュールを更新します。

28
kenorb

この要点 は、コマンドラインの1行でタスクを実行します。

curl -s https://api.github.com/orgs/[your_org]/repos?per_page=200 | Ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]} ]}'

[your_org]を組織の名前に置き換えます。必要に応じて、per_pageを設定します。

UPDATE:

ATutorMeが述べたように、最大​​ページサイズは100です GitHubのドキュメントによる

100を超えるリポジトリがある場合、pageパラメーターをURLに追加する必要があり、各ページに対してコマンドを実行できます。

curl -s "https://api.github.com/orgs/[your_org]/repos?page=2&per_page=100" | Ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]} ]}'

注:デフォルトのper_pageパラメーターは30です。

19
seancdavis

[アカウント設定]-> [アプリケーション]に移動し、APIキーを作成します
次に、以下のスクリプトにAPIキー、githubインスタンスのURL、および組織名を挿入します

#!/bin/bash

# Substitute variables here
ORG_NAME="<ORG NAME>"
ACCESS_TOKEN="<API KEY>"
GITHUB_INSTANCE="<GITHUB INSTANCE>

URL="https://${GITHUB_INSTANCE}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}"

curl ${URL} | Ruby -rjson -e 'JSON.load(STDIN.read).each {|repo| %x[git clone #{repo["ssh_url"]} ]}'

それをファイルに保存し、chmod u+xファイルを実行します。

Rubyコードの Arnaud に感謝します。

5
Cory Klein

それで、私も答えを追加します。 :)(簡単だとわかりました)

リストの取得(「magento」会社を使用しました):

curl -si https://api.github.com/users/magento/repos | grep ssh_url | cut -d '"' -f4

HTTPアクセスを使用するには、clone_urlの代わりにssh_urlを使用します。

それで、それらすべてをクローンしましょう! :)

curl -si https://api.github.com/users/magento/repos | \
    grep ssh_url | cut -d '"' -f4 | xargs -i git clone {}

プライベートリポジトリを取得する場合-GETパラメータ?access_token=YOURTOKENを追加するだけです

4
Kirby

the Gist @seancdavisでコメントを見つけました。特に元のポスターのように、すべてのリポジトリをすばやくアクセスできるように同期したかったのですが、その大半はプライベートでした。

curl -u [[USERNAME]] -s https://api.github.com/orgs/[[ORGANIZATION]]/repos?per_page=200 |
  Ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]} ]}'

[[USERNAME]]をgithubユーザー名に、[[ORGANIZATION]]をGithub組織に置き換えます。出力(JSONリポジトリメタデータ)は、単純なRubyスクリプトに渡されます。

# bring in the Ruby json library
require "json"

# read from STDIN, parse into Ruby Hash and iterate over each repo
JSON.load(STDIN.read).each do |repo|
  # run a system command (re: "%x") of the style "git clone <ssh_url>"
  %x[git clone #{repo["ssh_url"]} ]
end
3
Garren S

Python3とGithub APIv3でスクリプトを作成しました

https://github.com/muhasturk/gitim

ただ走れ

./gitim
2
muhasturk

上記のコマンドとツールをいくつか試しましたが、面倒すぎると判断したため、これを行う別のコマンドラインツール github-dl を作成しました。

使用するには(nodejsがインストールされていると仮定)

npx github-dl -d /tmp/test wires

これは、wiresからすべてのリポジトリのリストを取得し、CLIで指定した認証詳細(ユーザー/パス)を使用して、testディレクトリに情報を書き込みます。

詳しくは、

  1. 認証を要求(2FAをサポート)
  2. Github APIを介してユーザー/組織のリポジトリのリストを取得します
  3. このページネーションを行うため、100以上のレポがサポートされます

実際にはリポジトリを複製しませんが、代わりにxargsに渡して複製を行うことができる.txtファイルを作成します。次に例を示します。

cd /tmp/test
cat wires-repo-urls.txt | xargs -n2 git clone

# or to pull
cat /tmp/test/wires-repo-urls.txt | xargs -n2 git pull

たぶんこれはあなたにとって便利です。 JSはほんの数行なので、ニーズに合わせて簡単に調整できます。

2
wires
curl -s https://api.github.com/orgs/[GITHUBORG_NAME]/repos | grep clone_url | awk -F '":' '{ print $2 }' | sed 's/\"//g' | sed 's/,//' | while read line; do git clone "$line"; done
2
julianzhang

このpythonワンライナーが必要なことを行います。それ:

  • githubで利用可能なリポジトリを確認します
  • それぞれについて、git cloneへのシステムコールを行います

    python -c "import json, urllib, os; [os.system('git clone ' + r['ssh_url']) for r in json.load(urllib.urlopen('https://api.github.com/orgs/<<ORG_NAME>>/repos?per_page=200'))]"
    
1
Evren Ozkan

簡単なソリューション:

NUM_REPOS=1000
DW_FOLDER="Github_${NUM_REPOS}_repos"
mkdir ${DW_FOLDER}
cd ${DW_FOLDER}
for REPO in $(curl https://api.github.com/users/${GITHUB_USER}/repos?per_page=${NUM_REPOS} | awk '/ssh_url/{print $2}' | sed 's/^"//g' | sed 's/",$//g') ; do git clone ${REPO} ; done
1
Antonio Feitosa

これを行うために、pipモジュールを作成しました。 Windows、Linux、およびOSXで動作します。

https://github.com/zeusofjuice/starclone

以下を使用してレポのクローンを作成できます:

starclone <user> 

ヘルプファイルまたはREADMEから指定できるフラグがいくつかあります。

1
samdixon

誰かがWindowsソリューションを探している場合に備えて、トリックを実行するPowerShellの小さな関数を次に示します(プロキシを使用する場合と使用しない場合の両方で動作するために必要な場合は、ワンライナー/エイリアスを使用できます)。

function Unj-GitCloneAllBy($User, $Proxy = $null) {
    (curl -Proxy $Proxy "https://api.github.com/users/$User/repos?page=1&per_page=100").Content 
      | ConvertFrom-Json 
      | %{ $_.clone_url } 
      # workaround git printing to stderr by @wekempf aka William Kempf
      # https://github.com/dahlbyk/posh-git/issues/109#issuecomment-21638678
      | %{ & git clone $_ 2>&1 } 
      | % { $_.ToString() }
}

したがって、実際には、FOOに一致する組織BARからすべてのリポジトリを複製する場合、以下の1行を使用できます。これには jq およびcommon cliが必要ですユーティリティ

curl 'https://api.github.com/orgs/FOO/repos?access_token=SECRET' |
  jq '.[] |
  .ssh_url' |
  awk '/BAR/ {print "git clone " $0 " & "}' |
  sh
1
konr

これを行うには非常に便利な npm module もあります。クローンするだけでなく、プルすることもできます(すでに持っているデータを更新するため)。

このような設定を作成するだけです:

[{
   "username": "BoyCook",
   "dir": "/Users/boycook/code/boycook",
   "protocol": "ssh"
}]

gitall cloneなどを実行します。またはgitall pull

1

このようなリストにリポジトリのリストがある場合、このシェルスクリプトは機能します。

user="https://github.com/user/"

declare -a arr=("repo1", "repo2")

for i in "${arr[@]}"

do

   echo $user"$i"

   git clone $user"$i"

done 

curlを使用してリポジトリのリストを取得し、bashループで上記のリストを反復処理できます。

GIT_REPOS=`curl -s curl https://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN} | grep ssh_url | awk -F': ' '{print $2}' | sed -e 's/",//g' | sed -e 's/"//g'`
for REPO in $GIT_REPOS; do
  git clone $REPO
done
0

オープンソースツールを使用して、多数のgithubリポジトリを複製できます。 https://github.com/artiomn/git_cloner

例:

git_cloner --type github --owner octocat --login user --password user https://my_bitbucket

api.github.comからJSON APIを使用します。コード例はgithubのドキュメントで見ることができます: https://developer.github.com/v3/

またはそこに:

https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py

0
A.N.

アクセスキーとpython 3を指定し、インストールされているモジュールを要求するプライベートリポジトリのみを複製するには:

ORG=company; ACCESS_KEY=0000000000000000000000000000000000000000; for i in $(python -c "import requests; print(' '.join([x['ssh_url'] for x in list(filter(lambda x: x['private'] ,requests.get('https://api.github.com/orgs/$ORG/repos?per_page=1000&access_token=$ACCESS_KEY').json()))]))"); do git clone $i; done;
0
ubugnu

Linkヘッダーを介した徹底的なページネーションを含むPython3ソリューション。

前提条件:


import json
import requests
from requests.auth import HTTPBasicAuth
import links_from_header

respget = lambda url: requests.get(url, auth=HTTPBasicAuth('githubusername', 'githubtoken'))

myorgname = 'abc'
nexturl = f"https://api.github.com/orgs/{myorgname}/repos?per_page=100"

while nexturl:
    print(nexturl)
    resp = respget(nexturl)

    linkheads = resp.headers.get('Link', None)
    if linkheads:
        linkheads_parsed = links_from_header.extract(linkheads)
        nexturl = linkheads_parsed.get('next', None)
    else:
        nexturl = None

    respcon = json.loads(resp.content)
    with open('repolist', 'a') as fh:
        fh.writelines([f'{respconi["full_name"]}\n' for respconi in respcon])

次に、xargsまたは parallel およびcat repolist | parallel -I% hub clone %を使用できます。

0
Jose Alban

ここでの一般的な回答では、per_pageで指定しても、Github APIが最大100個のリポジトリのみを返すことを考慮していません。 100を超えるリポジトリを持つGithub組織を複製する場合、API応答のページングリンクをたどる必要があります。

それを行うためのCLIツール を書きました:

clone-github-org -o myorg

これにより、myorg組織内のすべてのリポジトリが現在の作業ディレクトリに複製されます。

0
Chad

サンプルバッチスクリプトを作成しました。すべてのプライベート/パブリックリポジトリをgithub.comからダウンロードできます。リポジトリがダウンロードされると、自動的にZipファイルに変換されます。

@echo off
setlocal EnableDelayedExpansion
SET "username=olyanren"
SET "password=G....."
set "mypath=%cd%\"
SET "url=https://%username%:%password%@github.com/%username%/"
FOR /F "tokens=* delims=" %%i in (files.txt) do (
SET repo=%%i
rmdir /s /q !repo!
git clone "!url!!repo!.git"
cd !repo!
echo !mypath!
git archive --format=Zip -o "!mypath!!repo!.Zip" HEAD
cd ..
)

注:files.txtファイルには、次のようなリポジトリ名のみを含める必要があります。

repository1
repository2
0
olyanren

5月19日から更新

組織にこのbashコマンドを使用します(プライベートリポジトリが含まれます)

curl -u "{username}" "https://api.github.com/orgs/{org}/repos?page=1&per_page=100" | grep -o 'git@[^"]*' | xargs -L1 git clone
0
Tommy

ユーザーからすべてのリポジトリ(パブリックおよびプライベート)を複製するコメント付きの別のシェルスクリプト:

#!/bin/bash

USERNAME=INSERT_USERNAME_HERE
PASSWORD=INSERT_PASSWORD_HERE

# Generate auth header
AUTH=$(echo -n $USERNAME:$PASSWORD | base64)

# Get repository URLs
curl -iH "Authorization: Basic "$AUTH https://api.github.com/user/repos | grep -w clone_url > repos.txt

# Clean URLs (remove " and ,) and print only the second column
cat repos.txt | tr -d \"\, | awk '{print $2}'  > repos_clean.txt

# Insert username:password after protocol:// to generate clone URLs
cat repos_clean.txt |  sed "s/:\/\/git/:\/\/$USERNAME\:$PASSWORD\@git/g" > repos_clone.txt

while read FILE; do
    git clone $FILE
done <repos_clone.txt

rm repos.txt & rm repos_clone.txt
0
hlorand