git archive
を用いると、 clone せずに特定のディレクトリを取得できる。
詳細は git-archive のコマンドを用いると、対象レポジトリを clone せずとも、特定の branch の特定のディレクトリだけを取得することができる。
git archive --remote=git@github.com:UserName/repo-name.git \
master:subdir/foo | tar -x
上記コマンドを実行すると、対象リモートレポジトリの、 master
ブランチのsubdir/foo
ディレクトリの中身を取得して、現在のディレクトリに展開してくれる。
デフォルトだと、ブランチやタグなど ref名でしか取得できない
master
や v1.5.0
などといった、ブランチやタグであるならば、上記のコマンドによってレポジトリのサブディレクトリを clone することなく取得できる。もっと具体的にいうと、 ref としての名前が付いているリビジョンであるならば、 clone することなく取得できる。
普通に考えると、ancestry references を利用して master^:subdir
とか、任意SHA-IDを指定した、 8fa4963ad7c43053767cca04eb42202c08ecebb1:subdir
とかで取得できると期待するのだけれども、残念ながらそうはなっていない。
その理由と回避方法
なんでそうなるかについては、 git-upload-archive に記述がある。簡単にいうと、それを許してしまうとサーバー側の処理が大変になってしまうから、だと。
なので、サーバー側で uploadArchive.allowUnreachable
の config を設定してやると、任意 SHA-ID 指定ができるようにはなるよ、とかいてある。ただし、その場合はそのリビジョンが、正当なものであるかの検証(つまり、どこかしらのブランチ・タグから歴史をたどって到達可能か)はスキップされるよ、とのこと。