出来ること
大型リポジトリの中の一部のコード、サンプルをダウンロードしたい。
使用ツール
tiged degitの後継ツールです。
degit 2021年から開発が止まっています。
インストール方法
npm install -g tiged
もしくは、npx を付けて実行します。(この方法は実行時に少々時間がかかります)
使用方法
Next.jsのリポジトリの中にあるサンプル hello-world (約2KB)
https://github.com/vercel/next.js/tree/canary/examples/hello-world
適当な空フォルダの場所に行き、terminalを開きます。
tiged + ユーザーアカウント名 + パス
tiged vercel/next.js/examples/hello-world
npx tiged vercel/next.js/examples/hello-world
GitHubのパスはリポジトリの横にコピーボタンがあるのでそれを利用します。
↑の画像では
vercel/next.js
next.js/examples/hello-world
この2つの文字列を繋げていますが、next.js が被っています。
ユーザーアカウント名は vercel です。
パスは next.js/examples/hello-world です。
↑この2つの文字列を繋げて実行します。
使用方法はdegit時代の方法と変わっていません。
詳細なルールは下記のdegit時代の記事を参照してください。
フォルダの指定
上記コマンドはその場にダウンロードする方法でした、しかし上記コマンドに hello-world
という↓フォルダ名を指定すると、
tiged vercel/next.js/examples/hello-world hello-world
新たに hello-world
というフォルダが作成され、その中にダウンロードされます。
失敗した場合
cloned
と表示されたのにフォルダが空の場合は何らかの原因で失敗している場合があります。
そんな時は、
C:\Users\{ユーザー名}\.degit\github\**
の中に圧縮ファイルがダウンロードされているので、自分の好きな場所にコピーして解凍してください。
比較対象
Next.jsのリポジトリ (約50000KB)
https://github.com/vercel/next.js
GitHub CLIを使って巨大なリポジトリをクローンする方法
gh repo clone vercel/next.js
ツールのリポジトリ
GitHub - tiged/tiged: Community driven fork of degit
GitHub - Rich-Harris/degit: Straightforward project scaffolding
ここより下は過去(degit時代の)記事です。
ここより下は degit を tiged に置き換えてもほぼ同じように使えます。
tiged は degit をforkしたものです。
必要環境
Node.js 8以上
トラブル
エラー
! zlib: unexpected end of file
解凍がうまくいきませんでした。
解決方法
{home}/.degit/ にあるフォルダを削除する。
巨大ファイルをダウンロードしようとしていたが、途中でコマンドを止めてしまうと中途半端にキャッシュが残りこのエラーが出てしまう。なのでキャッシュしているフォルダを削除すれば直ります。
使用例
巨大リポジトリ Next.jsの中のサンプル hello-world をダウンロードしたい。
Next.jsのリポジトリ (約50000KB)
https://github.com/vercel/next.js
(Next.js のお試しサンプルはNext.jsリポジトリ内に300本以上用意されています。)
Next.jsのリポジトリの中にあるサンプル hello-world (約2KB)
https://github.com/vercel/next.js/tree/canary/examples/hello-world
git cloneコマンドはリポジトリすべてをダウンロードするため時間がかかります。
気軽にNext.jsのサンプルを試せません、そこで degit
を使います。
degit の github リポジトリ
Rich-Harris/degit: Straightforward project scaffolding
インストール
npm install -g degit
ダウンロード
degit vercel/next.js/examples/hello-world
このようにサンプル hello-world への ユーザーアカウント名+パス を指定するだけでOKです。
※ユーザーアカウント名(ここではvercel)をつけることを忘れないでください。
degit vercel/next.js/examples/hello-world
degit ユーザーアカウント名+パス
ダウンロード先は空である必要があります、ローカル側になにも存在しない場合のみダウンロードできます。
いくつかの使用パターン例
現在位置に直接ダウンロード(ダウンロード先のフォルダ名を指定しない場合)
degit vercel/next.js/examples/hello-world
ダウンロード先のフォルダを指定したい場合
degit vercel/next.js/examples/hello-world ./{ダウンロード先のフォルダ名}
フォルダ名を指定して(/hello
)現在位置の下にダウンロード
degit vercel/next.js/examples/hello-world ./hello
フォルダ名を指定して(/hello
)ルートフォルダの下にダウンロード
degit vercel/next.js/examples/hello-world /hello
X 出来ない ルートフォルダ直下(/
)にダウンロードは不可 (強制コマンドオプションを使用すれば可能)
degit vercel/next.js/examples/hello-world /
degit は使いたいが、degit自体を環境内にインストールしたくない場合。
degit
の 前に npx
をつければインストールせずに degit
が使えます。
使用例
npx degit ユーザーアカウント名/リポジトリのパス ./{ダウンロード先のフォルダ名}
npx degit vercel/next.js/examples/hello-world
npx degit vercel/next.js/examples/hello-world ./hello
npx degit vercel/next.js/examples/hello-world /hello
ブランチ、タグ、コミットを指定する
(デフォルトのブランチはmain)
degit user/repo#dev
# ブランチ dev
degit user/repo#v1.2.3
# タグ v1.2.3
degit user/repo#1234abcd
# commit ハッシュ 1234abcd
リポジトリ全体をダウンロードする。
リポジトリ全体をダウンロードする事も可能です。(= git clone
コマンドとほぼ同じ)
このコマンドは
degit user/repo
(degit {ユーザーアカウント名}/{リポジトリ名}
)
以下と同じ
degit github:user/repo
degit git@github.com:user/repo
degit https://github.com/user/repo
その他のソフトウェア開発のプラットフォームでの使用例
GitLab からダウンロード
degit gitlab:user/repo
degit git@gitlab.com:user/repo
degit https://gitlab.com/user/repo
BitBucket からダウンロード
degit bitbucket:user/repo
degit git@bitbucket.org:user/repo
degit https://bitbucket.org/user/repo
Sourcehut からダウンロード
degit git.sr.ht/user/repo
degit git@git.sr.ht:user/repo
degit https://git.sr.ht/user/repo
JavaScript API
Nodeスクリプトの中でdegitを使うこともできます。
const degit = require('degit');
const emitter = degit('user/repo', {
cache: true,
force: true,
verbose: true,
});
emitter.on('info', info => {
console.log(info.message);
});
emitter.clone('path/to/dest').then(() => {
console.log('done');
});
その他
git clone
のオプションコマンドに degit
と同じことが出来るコマンドがあります、しかし長く、覚えづらく、そして使いづらいです。
リポジトリの中の1つのファイルだけを取ってくる時はcurlコマンドを使っていました。