🔥

githubから1つのディレクトリだけをダウンロードするシェルスクリプト

2022/08/15に公開

結論

あんまり意味がなかった。。

やりたいこと

gir repositoryから、1つのディレクトリ(フォルダ)だけをダウンロードしたい。1つのリポジトリに多数のサンプルが入っているときなどに、全部ダウンロードするの大変だなーと思っていたので。

やっていること

gitのsparse checkoutを使ってディレクトリを指定して取得。その後はgit管理はしない想定で、.gitなどは削除

注意点

リポジトリ全部を一度取り込むことになるので、時間としてはあまり変わらないです。大きいリポジトリだと時間がかかります

余談

Python requestsで直接ダウンロードしたら早くなるかな、と思ったけどPythonは遅かったです。
git 23秒 python 183秒 (https://github.com/aws-samples/aws-cdk-examples.gitpython/ で比較) 記事はこちら

前提

  • git (>2.28)

使い方

bash git_sparse_checkout.sh <対象repo> <対象ディレクトリ>

例えば、awsのサンプルからあるディレクトリDynamoDB-SDK-Examplesだけを取り出したいとき。

bash git_sparse_checkout.sh https://github.com/aws-samples/aws-dynamodb-examples.git DynamoDB-SDK-Examples

remote: Enumerating objects: 1712, done.
remote: Counting objects: 100% (232/232), done.
remote: Compressing objects: 100% (94/94), done.
remote: Total 1712 (delta 183), reused 140 (delta 138), pack-reused 1480
Receiving objects: 100% (1712/1712), 367.36 KiB | 100.00 KiB/s, done.
Resolving deltas: 100% (993/993), done.
From https://github.com/aws-samples/aws-dynamodb-examples
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
"DynamoDB-SDK-Examples" has successfully copied!

スクリプト

  • ターゲットrepoのデフォルトがmainだったりmasterだったりするので、その場で調べて同じ名前を作ることにしている
  • dir_tmp/dirという感じで2回ディレクトリが作られることになるが、あとで移動させてdir_tmpは消している
  • 実行するディレクトリに、target_dirができて終了する。
  • 未確認:同じディレクトリ名が存在するとき、マッチするものを全部とってくるかも?

参考にしたもの

いろいろなブログからまとめてスクリプト化してます。

だいたいのブログの元ネタはこちらの英語ブログ(2013年)と思われます。

余談

このやり方は古いみたいで、新しいのは公式でこう書かれていたり

Discussion