会社のGitHubアカウントを持っているので、自動化のために作成される可能性のある新しいものをすべて考慮して、内部のすべてのリポジトリをバックアップします。私はこのようなものを望んでいた:
git clone [email protected]:company/*.git
または同様のものが動作しますが、そこにワイルドカードが好きではないようです。
Gitにクローンを作成し、適切なアクセス許可があると仮定してすべてをプルする方法はありますか?
そのようにするのは不可能だと思います。最善の策は、APIを使用して組織のリポジトリのリストを見つけてループすることです。
これを試して:
http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
を呼び出しますssh_url
プロパティを特に探していると思います。git clone
これらの各ssh_url
s。少し手間がかかりますが、GitHubで適切な認証が必要です。
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
組織からすべてのリポジトリを複製するには、次のシェルワンライナーを試してください。
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
をクエリ文字列に追加します。hub
を使用することです。こちらもご覧ください:
ヒント:
-速度を上げるには、xargs
に-P
パラメーターを指定して、並列プロセスの数を設定します(-P4
= 4プロセス)。
-GitHubの制限を引き上げる必要がある場合は、APIキーを指定して認証を試みてください。
---recursive
を追加して登録済みサブモジュールに再帰し、内部のネストされたサブモジュールを更新します。
この要点 は、コマンドラインの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
です。
[アカウント設定]-> [アプリケーション]に移動し、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 に感謝します。
それで、私も答えを追加します。 :)(簡単だとわかりました)
リストの取得(「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
を追加するだけです
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
上記のコマンドとツールをいくつか試しましたが、面倒すぎると判断したため、これを行う別のコマンドラインツール
github-dl
を作成しました。
使用するには(nodejsがインストールされていると仮定)
npx github-dl -d /tmp/test wires
これは、wires
からすべてのリポジトリのリストを取得し、CLIで指定した認証詳細(ユーザー/パス)を使用して、test
ディレクトリに情報を書き込みます。
詳しくは、
実際にはリポジトリを複製しませんが、代わりに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はほんの数行なので、ニーズに合わせて簡単に調整できます。
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
このpythonワンライナーが必要なことを行います。それ:
それぞれについて、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'))]"
簡単なソリューション:
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
これを行うために、pipモジュールを作成しました。 Windows、Linux、およびOSXで動作します。
https://github.com/zeusofjuice/starclone
以下を使用してレポのクローンを作成できます:
starclone <user>
ヘルプファイルまたはREADMEから指定できるフラグがいくつかあります。
誰かが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
これを行うには非常に便利な npm module もあります。クローンするだけでなく、プルすることもできます(すでに持っているデータを更新するため)。
このような設定を作成するだけです:
[{
"username": "BoyCook",
"dir": "/Users/boycook/code/boycook",
"protocol": "ssh"
}]
gitall clone
などを実行します。またはgitall pull
このようなリストにリポジトリのリストがある場合、このシェルスクリプトは機能します。
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
オープンソースツールを使用して、多数の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
アクセスキーと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;
Link
ヘッダーを介した徹底的なページネーションを含むPython3ソリューション。
前提条件:
pip3 install links-from-link-header
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 %
を使用できます。
ここでの一般的な回答では、per_page
で指定しても、Github APIが最大100個のリポジトリのみを返すことを考慮していません。 100を超えるリポジトリを持つGithub組織を複製する場合、API応答のページングリンクをたどる必要があります。
それを行うためのCLIツール を書きました:
clone-github-org -o myorg
これにより、myorg
組織内のすべてのリポジトリが現在の作業ディレクトリに複製されます。
サンプルバッチスクリプトを作成しました。すべてのプライベート/パブリックリポジトリを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
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
ユーザーからすべてのリポジトリ(パブリックおよびプライベート)を複製するコメント付きの別のシェルスクリプト:
#!/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