私は会社の 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 に適切な認証が必要です。
組織からすべてのリポジトリを複製するには、次のシェル ワンライナーを試してください。
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>'
?access_token=TOKEN
または param ( ) で渡します。次に例を示します。
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 キーを構成してから使用することです。以下も参照してください。
ヒント: - 高速化するには、パラメータを
指定して並列プロセス数を設定します( = 4 プロセス)。-P
xargs
-P4
- GitHub の制限を上げる必要がある場合は、API キーを指定して認証を試みてください。
---recursive
登録されたサブモジュールに再帰を追加し、ネストされたサブモジュールを更新します。
公式の GitHub CLI ツールを使用した簡単なソリューションを次に示しgh
ます。API キーは不要で、任意の数のプライベート リポジトリを処理できます。
# 1. Login with gh for private repos, and follow prompts
gh auth login
# 2. Clone (or update) up to 1000 repos under `./myorgname` folder
# [replace 'myorgname' with your org name and increase repo limit if needed]
gh repo list myorgname --limit 1000 | while read -r repo _; do
gh repo clone "$repo" "$repo"
done
GitHub CLI ツールを入手するには:
brew install gh
GitHub CLI ツールは、GitHub API の変更に伴い、長期的にサポートされます。
新しいリポジトリを追加するだけでなく、既にディスク上にあるリポジトリ フォルダーを更新するには、gh repo clone
その行を次のように置き換えて、エラーがないかどうかを確認する必要があります。
gh repo clone "$repo" "$repo" -- -q 2>/dev/null || (
cd "$repo"
# Handle case where local checkout is on a non-main/master branch
# - ignore all errors because some repos may have zero commits,
# so no main or master
set +e
git checkout -q main 2>/dev/null
git checkout -q master 2>/dev/null
git pull -q
set -e
)
この要点は、コマンド ラインの 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
です。
だから、私も私の答えを追加します。:) (私はそれが簡単だとわかりました)
リストを取得します(「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
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
上記のコマンドとツールをいくつか試してみましたが、面倒だと判断したため、これを行うための別のコマンドライン ツールを作成しました
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 なので、ニーズに合わせて簡単に調整できるはずです
最初に認証用の個人トークンを作成し、すべてのrepo
権限があることを確認します
curl -u username:token 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
あなたの友達です
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
これを行うための非常に便利なnpm モジュールもあります。複製するだけでなく、プルすることもできます (既存のデータを更新するため)。
次のように構成を作成するだけです。
[{
"username": "BoyCook",
"dir": "/Users/boycook/code/boycook",
"protocol": "ssh"
}]
gitall clone
たとえば、次のようにします。またはgitall pull
誰かが 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() }
}
を使用してリポジトリのリストを取得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.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
GitHub アーカイブのようなツールを使用すると、公開および非公開の個人リポジトリ、組織リポジトリ、要旨をすべて 1 つのシンプルなツールで複製/プルできます。
自動化に関しては、たとえば GitHub アーカイブを 1 日 1 回または 1 週間に 1 回実行するように設定できます。これにより、クローンされたものはスキップされ、他のすべての最後の実行以降の新しい変更が取り込まれます。
このようなリストにリポジトリのリストがある場合、このシェル スクリプトは機能します。
user="https://github.com/user/"
declare -a arr=("repo1", "repo2")
for i in "${arr[@]}"
do
echo $user"$i"
git clone $user"$i"
done