136

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

git clone git@github.com:company/*.git 

または同様の方法でも機能しますが、ワイルドカードが気に入らないようです。

Git でクローンを作成し、適切な権限があると仮定してすべてをプルする方法はありますか?

4

38 に答える 38

64

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

これを試して:

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

少し余分な作業ですが、GitHub に適切な認証が必要です。

于 2013-10-24T21:40:51.367 に答える
62

組織のリポジトリ

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

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には、クエリ文字列に追加します。
  • もう 1 つの方法はhub、API キーを構成してから使用することです。

以下も参照してください。


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

于 2015-09-26T23:23:22.023 に答える
26

GitHub CLI を使用した単純なスクリプト (API キーなし)

公式の 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 ツールを入手するには:

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
    )

バックグラウンド

于 2021-08-13T10:48:15.250 に答える
25

この要点は、コマンド ラインの 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です。

于 2015-01-06T18:18:08.393 に答える
9

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

リストを取得します(「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

于 2016-11-03T23:36:46.633 に答える
5

Python3とGithub APIv3でスクリプトを作ってみた

https://github.com/muhasturk/gitim

とにかく走れ

./gitim
于 2015-10-04T11:19:32.033 に答える
5
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
于 2018-04-23T11:07:47.763 に答える
4

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

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

npx github-dl -d /tmp/test wires

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

詳しくは、

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

実際にはリポジトリのクローンを作成しませんが、代わりに、クローンを作成するために.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 なので、ニーズに合わせて簡単に調整できるはずです

于 2019-06-20T12:04:54.017 に答える
3

フォークではないすべてのパブリック リポジトリとプライベート リポジトリのクローンを作成します。

最初に認証用の個人トークンを作成し、すべて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

Gists を複製します。

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

jqGists のレポの名前はハッシュであるため、このコマンドは複雑です。そのため、コマンドはすべてのファイル名を連結してレポの名前にします。


を使用して任意に JSON をフィルタリングできます。jq

インストール:sudo apt-get install jq

上記の例では、これを使用してフォークを除外しました: curl ... | jq -r 'map(select(.fork == false))' ...--カジュアルなプル リクエストを行ったリポジトリのクローンを作成しない場合に役立ちます。

jqは、いくつかの非常に高度な機能をサポートしています。man jqあなたの友達です


Github の API URL

  • リポジトリ (認証が必要): 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

リポジトリの Github API ドキュメント

于 2019-12-30T04:46:23.317 に答える
2

これを行うための非常に便利なnpm モジュールもあります。複製するだけでなく、プルすることもできます (既存のデータを更新するため)。

次のように構成を作成するだけです。

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

gitall cloneたとえば、次のようにします。またはgitall pull

于 2015-11-06T14:27:07.560 に答える
2

誰かが 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() }
}
于 2016-10-06T11:34:49.390 に答える
1

を使用してリポジトリのリストを取得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
于 2016-09-20T14:30:26.693 に答える
1

サンプルのバッチ スクリプトを作成しました。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
于 2019-01-25T12:44:35.077 に答える
1

GitHub アーカイブのようなツールを使用すると、公開および非公開の個人リポジトリ、組織リポジトリ、要旨をすべて 1 つのシンプルなツールで複製/プルできます。

自動化に関しては、たとえば GitHub アーカイブを 1 日 1 回または 1 週間に 1 回実行するように設定できます。これにより、クローンされたものはスキップされ、他のすべての最後の実行以降の新しい変更が取り込まれます。

ソース: https://github.com/Justintime50/github-archive

于 2020-10-12T03:26:11.753 に答える
1

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

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

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

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

do

   echo $user"$i"

   git clone $user"$i"

done 
于 2018-07-16T13:44:19.870 に答える