私は会社のGitHubアカウントを持っています。自動化の目的で作成される可能性のある新しいものすべてを考慮して、内部のすべてのリポジトリをバックアップします。私はこのようなものを望んでいました:
git clone git@github.com:company/*.git
または同様のものは機能しますが、ワイルドカードが好きではないようです。
Gitにクローンを作成し、適切な権限があると仮定してすべてをプルする方法はありますか?
私は会社のGitHubアカウントを持っています。自動化の目的で作成される可能性のある新しいものすべてを考慮して、内部のすべてのリポジトリをバックアップします。私はこのようなものを望んでいました:
git clone git@github.com:company/*.git
または同様のものは機能しますが、ワイルドカードが好きではないようです。
Gitにクローンを作成し、適切な権限があると仮定してすべてをプルする方法はありますか?
回答:
そのようにすることは不可能だと思います。あなたの最善の策は、APIを使用して組織のリポジトリのリストを見つけてループすることです。
これを試して:
http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
ssh_url
物件を探しているでしょう。git clone
、それらssh_url
のそれぞれ。少し余分な作業ですが、GitHubが適切な認証を行う必要があります。
curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
https://github.com/api/v3/
、試してくださいhttps://api.github.com/
。
/users/${COMPANY}/repos
ではなくパスを使用することをお勧めします/orgs/${COMPANY}/repos
。
access_token
クエリパラメータの使用は廃止されているため、代わりにAuthorization HTTPヘッダーを使用してください。このトークンが、制御できないアプリによって使用されている場合、この非推奨の結果として機能しなくなる可能性があることに注意してください。
上のWindowsおよびすべてのUNIX / LINUXのシステムでは、使用してGitのバッシュまたは任意の他のターミナルを、交換する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
}
プライベートリポジトリを複製する必要がある場合は、次のようにヘッダーに認証トークンを追加できます。
-H 'Authorization: token <token>'
または、それをparam(?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
、APIキーを設定した後に使用することです。以下も参照してください。
ヒント:
-速度を上げるには-P
、xargs
(-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
必要に応じて設定してください。
更新:
ATutorMeが述べたように、GitHub docsによると、最大ページサイズは100 です。
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
実行します。
ルビコードを提供してくれたArnaudに感謝します。
だから、私も私の答えを追加します。:)(私はそれが簡単だと思いました)
リストを取得する(私は「magento」会社を使用しました):
curl -si https://api.github.com/users/magento/repos | grep ssh_url | cut -d '"' -f4
使用clone_url
代わりにssh_url
HTTPアクセスを使用します。
だから、それらすべてを複製しましょう!:)
curl -si https://api.github.com/users/magento/repos | \
grep ssh_url | cut -d '"' -f4 | xargs -i git clone {}
プライベートリポジトリを取得する場合-GETパラメータを追加するだけ ?access_token=YOURTOKEN
提供された要旨 @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リポジトリメタデータ)は、単純なルビスクリプトに渡されます。
# 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
.../orgs/[[organization]]/repos...
する必要がありました.../users/[[username]]/repos...
。これで、すべての作業を別のローカルマシンにすばやくインポートできます。ありがとう!
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
?page=2
です。
シンプルなソリューション:
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
上記のコマンドとツールをいくつか試しましたが、面倒すぎると判断したので、これを行うための別のコマンドラインツールを作成しました
github-dl
。
使用するには(nodejsがインストールされていることが前提)
npx github-dl -d /tmp/test wires
これは、CLIで提供する認証の詳細(ユーザー/パス)を使用して、すべてのリポジトリのリストを取得wires
し、test
ディレクトリに情報を書き込みます。
詳しくは
実際にはリポジトリのクローンは作成されませんが、代わりに、クローンを作成.txt
するxargs
ために渡すことができるファイルを書き込みます。次に例を示します。
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なので、ニーズに合わせて簡単に調整できます
誰かがWindowsソリューションを探している場合に備えて、PowerShellの小さな関数を以下に示します(プロキシを使用する場合と使用しない場合の両方で機能する必要がない場合は、oneliner /エイリアスの可能性があります)。
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() }
}
ユーザーからすべてのリポジトリ(パブリックおよびプライベート)を複製するコメント付きの別のシェルスクリプト:
#!/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
~/.bashrc file
私のチームでエイリアス/ bash関数を作成することでこれを解決しました ~/.bashrc file
ターミナルまたはLinuxシェルを開き、~/.bashrc file
以下を開きます。
sudo nano ~/.bashrc
この関数を追加します。
CloneAll() {
# Make the url to the input github organization's repository page.
ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";
# List of all repositories of that organization (seperated by newline-eol).
ALL_REPOS=$(curl -s ${ORG_URL} | grep html_url | awk 'NR%2 == 0' \
| cut -d ':' -f 2-3 | tr -d '",');
# Clone all the repositories.
for ORG_REPO in ${ALL_REPOS}; do
git clone ${ORG_REPO}.git;
done
}
〜/ .bashrcファイルを保存して閉じ、ターミナルを閉じます。これを行う必要があります。そうしないと、新しい関数が初期化されません。
新しいターミナルを開いて試してください:
CloneAll <your_github_org_name>
例:個人のgithubレポURLがhttps://github.com/awesome-asyncと呼ばれる場合、コマンドは次のようになります
CloneAll awesome-async
per_page=200
最初の変数の終わりには、ORG_URL
そのために特別な注意を払って、クローニングされますレポの数を設定します。
ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200"; <---- make sure this is what you want
お役に立てれば!:)
...repos?page=${2}&per_page=100";
を使用してリポジトリのリストを取得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
からJSON APIを使用しますapi.github.com
。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
または並列および使用することができます:cat repolist | parallel -I% hub clone %
このようなリストにリポジトリのリストがある場合、このシェルスクリプトは機能します。
user="https://github.com/user/"
declare -a arr=("repo1", "repo2")
for i in "${arr[@]}"
do
echo $user"$i"
git clone $user"$i"
done
サンプルのバッチスクリプトを作成しました。すべてのプライベート/パブリックリポジトリは、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
プライベートリポジトリでアクセスできる組織の場合:
curl -u <YOUR_GITHUB_USERNAME> -s https://api.github.com/orgs/<ORG_NAME>/repos?per_page=200 | ruby -rubygems -e ’require “json”; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo[“html_url”]} ]}'
を使用しているhtml_url
ためaccess_token
、プロンプトが表示されたときにgithubパスワードを入力するだけで済みます。
curl -u "username" https://api.github.com/user/repos\?page\=1\&per_page\=100 |
jq -r 'map(select(.fork == false)) | .[] | .ssh_url' |
xargs -L1 git clone
curl https://api.github.com/users/username/gists\?page\=1\&per_page\=100 |
jq -r ".[] | .git_pull_url +\" '\" + (.files|keys|join(\"__\") + \"'\")" |
xargs -L1 git clone
jq
gistsのレポの名前はハッシュであるため、このコマンドは複雑です。このコマンドは、すべてのファイル名を連結してレポの名前にします。
jq
インストール: sudo apt-get install jq
上記の例では、これを使用してフォークを除外しました:curl ... | jq -r 'map(select(.fork == false))' ...
- カジュアルなプルリクエストを行ったリポジトリを複製しない場合に便利です
jqは、いくつかの非常に高度な機能をサポートしています。man jq
あなたの友だちです
curl -u "username" ...
、プライベートリポジトリにアクセスできますhttps://api.github.com/user/repos\?page\=1\&per_page\=100
https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100
"""
Clone all public Github Repos
https://developer.github.com/v3/repos/#list-repositories-for-a-user
"""
import urllib.request, base64
import json
import os
def get_urls(username):
url = f"https://api.github.com/users/{username}/repos?per_page=200"
request = urllib.request.Request(url)
result = urllib.request.urlopen(request)
return json.load(result)
if __name__ == "__main__":
for r in get_urls("MartinThoma"):
if not os.path.isdir(r["name"]):
print(f"Clone {r['name']}...")
os.system("git clone " + r["ssh_url"])
else:
print(f"SKIP {r['name']}...")
独自のプライベートおよびパブリックのリポジトリをすべて複製するには、リポジトリのアクセス権を持つ新しいアクセストークンを生成し、これを使用します。
(独自のアクセストークンとユーザー名に置き換えます)
for line in $(curl https://api.github.com/user/repos?access_token=ACCESS_TOKEN_HERE | grep -o "git@github.com:YOUR_USER_NAME/[^ ,\"]\+");do git clone $line;done
これにより、現在のフォルダー内のすべてのリポジトリが複製されます
これは小さなbashプログラムです。ターミナルに貼り付けてEnterキーを押すだけです。