Gitリポジトリから1つのファイルだけをスパースチェックアウトするにはどうすればいいですか? 質問する

Gitリポジトリから1つのファイルだけをスパースチェックアウトするにはどうすればいいですか? 質問する

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' は、非コーン パターン マッチングに一致するオブジェクトのみを正しく含めます。
つまり、同じフィルターを使用して、コーン モードを有効にして新しくクローンされたリポジトリをチェックアウトすると、オブジェクトが見つからないため失敗します。

これらの問題を修正するには、すべてのパターンがディレクトリ一致またはパターン ' /*' のいずれかであることをアサートするコーン モード パターン チェックを追加します。
新しいパターン チェックを検証するテストを追加し、ディレクトリ以外のパターンが以前にキャッチされることを反映するように別のテストを変更します。

おすすめ記事