207

チェックアウトに数時間かかる非常に多数のファイルを含むリポジトリを使用しています。スパース チェックアウトをサポートするようになったので、Git がこの種のリポジトリでうまく機能するかどうかの可能性を調べていますが、私が見つけることができるすべての例は次のことを行います。

git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD

この一連のコマンドの問題は、元のクローンもチェックアウトを行うことです。元の clone コマンドに -n を追加すると、read-tree コマンドで次のエラーが発生します。

エラー: スパース チェックアウトは作業ディレクトリにエントリを残しません

最初にすべてのファイルをチェックアウトせずにスパース チェックアウトを行うにはどうすればよいですか?

4

15 に答える 15

167

この回答は、リポジトリからデータの完全なコピーをダウンロードすることに注意してください。このgit remote add -fコマンドは、リポジトリ全体を複製します。のマニュアルページからgit-remote

-fオプションを指定するとgit fetch <name>、リモート情報が設定された直後に実行されます。


これを試して:

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master

これで、path/within_repo/to/desired_subdir から (およびそのパス内に) ファイルのみが存在する「プルーニングされた」チェックアウトがあることがわかります。

Windows コマンド ラインでは、パスを引用符で囲んではならないことに注意してください。つまり、6 番目のコマンドを次のように変更する必要があります。

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout

そうしないと、スパースチェックアウトファイルで引用符が取得され、機能しません

于 2011-02-05T19:49:17.677 に答える
21

git 2.28 で動作します

git clone --filter=blob:none --no-checkout --depth 1 --sparse <project-url>
cd <project>
git sparse-checkout init --cone

複製するファイルとフォルダーを指定します

git sparse-checkout add <folder>/<innerfolder> <folder2>/<innerfolder2>
git checkout
于 2020-09-08T01:58:46.760 に答える
4

私はgitを初めて使用しますが、ディレクトリごとにgit checkoutを実行すると機能するようです。また、sparse-checkout ファイルには、示されているように、すべてのディレクトリの後に末尾のスラッシュが必要です。より多くの経験を積んだ誰かが、これが機能することを確認してください。

興味深いことに、sparse-checkout ファイルにないディレクトリをチェックアウトしても、違いはないようです。それらは git status に表示されず、 git read-tree -m -u HEAD によって削除されることはありません。git reset --hard でも、ディレクトリは削除されません。チェックアウトされているが、スパース チェックアウト ファイルに含まれていないディレクトリについて git がどう考えているかについて、経験豊富な人なら誰でもコメントできますか?

于 2010-11-06T20:09:17.173 に答える
3

git 2.27 では、git sparse checkout が進化したようです。この回答の解決策は、まったく同じようには機能しません (git 2.25 と比較して)

git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull

これらのコマンドはよりうまく機能しました:

git clone --sparse <URL> <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib

参照: git-clone --sparseおよびgit-sparse-checkout add

于 2020-07-20T16:24:10.137 に答える