私の 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