🎯 ゴール
git-sparse-checkout
スクリプトの解説
#!/bin/bash
set -euo pipefail
usage() {
echo "Usage: $0 -u <clone_url> -d <target_dir> -b <branch> -p <sparse_path>"
exit 1
}
while getopts "u:d:b:p:" opt; do
case $opt in
u) CLONE_URL=$OPTARG ;;
d) TARGET_DIR=$OPTARG ;;
b) BRANCH=$OPTARG ;;
p) SPARSE_PATH=$OPTARG ;;
*) usage ;;
esac
done
if [[ -z "$CLONE_URL" || -z "$TARGET_DIR" || -z "$BRANCH" || -z "$SPARSE_PATH" ]]; then
usage
fi
git clone --filter=blob:none --no-checkout "$CLONE_URL" "$TARGET_DIR"
cd "$TARGET_DIR"
git config core.sparseCheckout true
echo -e "$SPARSE_PATH" | tr ':' '\n' > .git/info/sparse-checkout
git checkout "$BRANCH"
✅ 使用方法
git-sparse-checkout -u <clone_url> -d <target_dir> -b <branch> -p <sparse_path>
パラメータ
オプション | 説明 | 必須 |
---|---|---|
-u |
Gitクローン用URL | ✅ はい |
-d |
クローン先のターゲットディレクトリ | ✅ はい |
-b |
チェックアウトするブランチ | ✅ はい |
-p |
リポジトリ内でチェックアウトするパス.ディレクトリは: で区切ります |
✅ はい |
使用例
git-sparse-checkout \
-u https://github.com/RyoNakagami/PythonCompetitiveProgramming \
-d ./checkout_sandbox \
-b main \
-p /Leetcode:/projecteuler/data
これにより:
- 完全な履歴やblobなしでリポジトリをクローン
- スパースチェックアウトモードを有効化
main
ブランチから/Leetcode
と/projecteuler/data
ディレクトリのみをチェックアウト- 結果を
./checkout_sandbox
に書き込みまむ
🔍 シェルスクリプトの詳細解説
ファイルコンテンツをダウンロードせず,効率的にリポジトリをクローンします.
git clone --filter=blob:none --no-checkout "$CLONE_URL" "$TARGET_DIR"
オプション | 説明 |
---|---|
--filter=blob:none |
初期段階でファイルコンテンツ(blob)を除外し,リポジトリのメタデータ(コミット,ツリー)のみをダウンロードするフィルタを使用した部分クローンを行います.これにより,ディスク使用量が削減されます. |
--no-checkout |
リポジトリをクローンするが,作業ディレクトリにファイルをチェックアウトしない.つまり,作業ディレクトリは空の状態になります(ファイルはチェックアウトされていません). |
次に,このローカルリポジトリに対してスパースチェックアウトを有効にします.これにより,リポジトリから作業ディレクトリに特定のパスのみを選択的にチェックアウトすることをGitに指示します.
git config core.sparseCheckout true
続いて,
echo -e "$SPARSE_PATH" | tr ':' '\n' > .git/info/sparse-checkout
コマンド | 説明 |
---|---|
echo -e "$SPARSE_PATH" |
エスケープシーケンス(\n など)を解釈してSPARSE_PATH 変数の値を出力します. |
tr ':' '\n' |
コロン(: )文字を改行文字(\n )に変換し,コロン区切りのリストを行区切りのリストに効果的に変換します. |
> .git/info/sparse-checkout |
このパスのリスト(1行に1つ)を特別なsparse-checkout設定ファイルに書き込みます |