Git リポジトリのサブディレクトリのみをクローンするにはどうすればいいですか? 質問する

Git リポジトリのサブディレクトリのみをクローンするにはどうすればいいですか? 質問する

私の Git リポジトリには、ルートに 2 つのサブディレクトリがあります。

/finisht
/static

これがSVNは、/finishtある場所でチェックアウトされましたが、 は/static別の場所でチェックアウトされました。

svn co svn+ssh://[email protected]/home/admin/repos/finisht/static static

Git でこれを行う方法はありますか?

ベストアンサー1

あなたがしようとしているのはスパースチェックアウトと呼ばれ、その機能は Git 1.7.0 (2012 年 2 月) で追加されました。スパースクローンを実行する手順は次のとおりです。

mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

これにより、リモートで空のリポジトリが作成され、すべてのオブジェクトが取得されますが、チェックアウトは行われません。次に、次の操作を実行します。

git config core.sparseCheckout true

次に、実際にチェックアウトするファイル/フォルダを定義する必要があります。これは、 にリストすることで行います.git/info/sparse-checkout。例:

echo "some/dir/" >> .git/info/sparse-checkout
echo "another/sub/tree" >> .git/info/sparse-checkout

最後に、リモートの状態を使用して空のリポジトリを更新します。

git pull origin master

これで、ファイル システムのファイルが「チェックアウト」some/dirされanother/sub/tree(パスはそのまま)、他のパスは存在しなくなります。

ぜひご覧になってみてください拡張チュートリアルおそらく公式のスパースチェックアウトのドキュメントそして読み取りツリー

機能として:

function git_sparse_clone() (
  rurl="$1" localdir="$2" && shift 2

  mkdir -p "$localdir"
  cd "$localdir"

  git init
  git remote add -f origin "$rurl"

  git config core.sparseCheckout true

  # Loops over remaining args
  for i; do
    echo "$i" >> .git/info/sparse-checkout
  done

  git pull origin master
)

使用法:

git_sparse_clone "http://github.com/tj/n" "./local/location" "/bin"

ただし、この方法ではサーバーからリポジトリ全体がダウンロードされます。チェックアウトのサイズが縮小されるだけです。現時点では、単一のディレクトリのみをクローンすることはできません。ただし、リポジトリの履歴が必要ない場合は、浅いクローンを作成することで少なくとも帯域幅を節約できます。udondanの回答浅い部分を組み合わせる方法については以下をご覧くださいクローンまばらなチェックアウト。


Git 2.25.0(2020年1月)時点では実験的なスパースチェックアウトGit にコマンドが追加されました:

git sparse-checkout init
# same as:
# git config core.sparseCheckout true

git sparse-checkout set "A/B"
# same as:
# echo "A/B" >> .git/info/sparse-checkout

git sparse-checkout list
# same as:
# cat .git/info/sparse-checkout

おすすめ記事