Skip to main content

git sparse-checkout

何をするものか

作業ツリーに出すファイルを、リポジトリ全体ではなく一部に絞るための機能。

  • cone モード
    ディレクトリを指定して、その配下を含めるモード
  • no-cone モード
    gitignore 風パターンで細かく指定するモード
    • 一部だけ含めたい場合にも使える
    • 一部を除外したい場合にも使える

通常は cone モードが基本。 ディレクトリ単位で十分なら、こちらのほうが単純で高速。

動機

以下の動機で no-cone モードを使う例を記載する。

  • Mac で日本語ファイル名を Git に登録すると Windows でチェックアウト時に不整合が起きやすい (特に半濁音のNFC/NFD差)
  • core.precomposeUnicode 設定などで変換する手もあるみたいだが、試して検証するのも気が向かない
  • そこで、Windows 側で日本語ファイル名を使うのをあきらめて、チェックアウト時は 日本語ファイルが入りうるフォルダは作業ツリーに出さないようにしたい

ちなみに Windows でファイル名に使えない文字( | など )はまた別問題で、この方法では解消しない。
このケースは、あきらめて Mac 側で rename してしまうのが良い。
( 「対象を選択」ではなく、「いったんenv全部を対象にしてから除外」という方式でやっているためか?は不明 )

手順

1. まず --no-checkout で clone する

ps1
git clone <repo-url> --no-checkout

→ この時点では、作業ツリーにファイルは展開されていない

2. --no-cone モードで sparse-checkout する

ps1
@'
/*
!/docs/zatta/
!/_*/
'@ | git sparse-checkout set --no-cone --stdin

これは複数行コメントに見えるかもしれないが、

  • 1行目 : まず全部含める
  • 2行目 : 除外フォルダパターン1
  • 3行目 : 除外フォルダパターン2

と書いているだけ

→ 作業ツリーに、指定したパターンのフォルダ/ファイルのみ展開される

あとはいつも通りの git 操作


以下広告