Git リポジトリから 1 つのファイルだけをチェックアウトするにはどうすればよいでしょうか?
ベストアンサー1
もともと2012年に言及したgit archive
(見るジャレッド・フォーサイスの答えそしてロバート・ナイトの答え)、 以来git1.7.9.5 (2012年3月)、ポール・ブランナンの答え:
git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -
しかし、2013年にはそれは不可能になった。リモート https://github.com URL の場合
旧ページを見るリポジトリをアーカイブできますか?「
現在の(2018年)ページ」GitHub でのコンテンツとデータのアーカイブについて「サードパーティのサービスの使用を推奨します。GHTorrentまたはGHアーカイブ。
したがって、ローカル コピー/クローンも処理できます。
前述のようにベアリポジトリのローカルコピーがある場合は、代わりに次の操作を行うこともできます。この答え、
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file
または、最初にリポジトリをクローンして、完全な履歴を取得する必要があります。
.gitリポジトリ内
作業ツリー内。
しかし、その後、スパースチェックアウト(Git1.7+ を使用している場合):
- スパースチェックアウトオプションを有効にする(
git config core.sparsecheckout true
) .git/info/sparse-checkout
ファイルに表示したい内容を追加する- 作業ツリーを再読み込みして必要なものだけを表示する
- スパースチェックアウトオプションを有効にする(
作業ツリーを再度読み込むには:
$ git read-tree -m -u HEAD
そうすれば、必要なものを正確に含む作業ツリーが完成します(たとえそれが 1 つのファイルだけであっても)。
リチャード・ゴメスポイント(コメント欄) に "Git リポジトリから単一のディレクトリまたはディレクトリのリストをクローン、フェッチ、またはスパース チェックアウトするにはどうすればよいですか?「
履歴のダウンロードを回避し、単一のブランチを取得し、必要なファイルまたはディレクトリのリストを取得する bash 関数。
Git 2.40 (2023 年第 1 四半期) では、スパース パターンをチェックして「コーン」モードを使用しているかどうかを確認するロジックが強化され、単一のファイルを指定するパターンがコーンを指定するものと誤解されることがなくなりました。
見るコミット 5842710(2023年1月3日)ウィリアム・スプレント(williams-unity
)(合併者:
ジュニオ・C・ハマノ -- gitster
--でコミット ab85a7d、2023年1月16日)
dir
: 単列コーンパターンをチェックする署名者: William Sprent
承認者: Victoria Dye
スパース チェックアウトのドキュメントには、コーン モード パターン セットは、ディレクトリを再帰的に含めるパターン、またはディレクトリ内のすべてのファイルに一致するパターンに制限されると記載されています。
スパース チェックアウト ファイルでは、前者は次の形式で示されます。/A/B/C/
後者は、次のいずれかの形式のパターンのペアになります。
/A/B/ !/A/B/*/
または、トップレベルのファイルに一致する特別なケースでは、次のようになります。
/* !/*/
'
add_pattern_to_hashsets()
' 関数には、非コーン パターンに遭遇したときにコーン モードを無効にするチェックが含まれています。
ただし、パターン リストが単一のファイルまたはディレクトリに一致しようとする場合、たとえば次の形式のパターンはキャッチされません。/A/B/C
このため、このようなパターンが sparse-checkout ファイルにあり、cone モードが有効になっている場合、sparse-checkout は予期しない動作を示します。
具体的には、上記のようなパターンでは、非コーン モードの sparse-checkout は '
/A/B/C
' にあるディレクトリまたはファイルのみを含めます。
ただし、コーン モードを有効にすると、sparse-checkout は代わりにトップレベルのファイルのみをマニフェストし、'/A/B/C
' にあるファイルはマニフェストしません。
--filter=sparse:oid=<oid>
関連して、' 'を使用して部分的なクローンを作成するときに同じ種類のフィルターを指定すると、問題が発生します。
'upload-pack
' は、非コーン パターン マッチングに一致するオブジェクトのみを正しく含めます。
つまり、同じフィルターを使用して、コーン モードを有効にして新しくクローンされたリポジトリをチェックアウトすると、オブジェクトが見つからないため失敗します。これらの問題を修正するには、すべてのパターンがディレクトリ一致またはパターン '
/*
' のいずれかであることをアサートするコーン モード パターン チェックを追加します。
新しいパターン チェックを検証するテストを追加し、ディレクトリ以外のパターンが以前にキャッチされることを反映するように別のテストを変更します。