はじめに
これは私があるリポジトリの翻訳をするために試行錯誤したもののなれの果てです。どうかみんなはこれを見て屍を越えてくれ……。
Gitでごちゃごちゃやった内容
やりたかったこと
CommonMarkには、README.mdの他にspec.txtというCommonMarkの仕様書が入っている。翻訳をしようとするが、ここにはほかのファイルもあって全部Cloneするのは面倒そうだった。そこで、README.mdとspec.txtのみをリポジトリから引っ張ってきて、翻訳対象のみをgithubで管理。あわよくばその後の更新も追随できるようにしたかった。したかった……。
ちなみに環境は
Windows 10
git version 2.13.1.windows.2
Take away
sparse-checkoutはこの用途には向かない。filter-branchで頑張るしかない。
やったこと
sparse-checkout
Gitで他のリポジトリから一部のファイルのみをcloneする方法というのを見つけた。ふむ、sparse-checkoutなるものがあるのか。
とりあえずやってみた。調べると多くはcloneするものが多かったが、こちらのサイトでは最初から一部を抜き出す方法でやっていたのでこれに従う。
git init
git config.sparsecheckout true
git remote commonmark https://github.com/commonmark/CommonMark.git
echo "README.md" > .\.git\info\sparse-checkout
echo "spec.txt" >> .\.git\info\sparse-checkout
git pull commonmark master
おお、できてるできてる。確かに2つしか入ってないぞ。

これをpushしてgithubで管理で切れば完璧だ。しかし……

現実は甘くなかった。sparse-checkoutはあくまで一部をcheckoutして作業ディレクトリに出す機能なので、ブランチには全部のファイルが残っているのである。巨大なリポジトリの一部のみ編集したいというときのための機能だろう。しかし、これでは今回は意味がない。一部を残してきれいさっぱり消滅させたいのだ。
filter-branch
どうもfilter-branchでそういうことができるらしい。巷では最強のオプションと呼ばれているとか。強い。しかし調べてみても「特定のファイルのみ除外する」のは簡単でも、「特定のファイルのみ残す」というのはあまり想定されていないようだった。サブディレクトリはできるんだけど……。地道にrmで消していくしかない。
git filter-branch --tree-filter 'rm -f 消したいファイルとか' -f HEAD

重要文書焼却ってこんな気持ちなのかな……。
CommonMarkの歴史は重く、風呂に入って洗濯物をたたんでもまだ終わっていなかった。そしてrmの使いかたが間違っており2度fatal errorで停止した。

今度はうまくpushできた。コミットツリーもそのまま残っている。
結論
2,3ファイルだけだし手動で引っ張ってきた方が早い。