問題
メインの開発ブランチからgit subtree push コマンドで、リポジトリの一部を別のブランチへと切り出したとき、
処理内で、開発ブランチのコミットを全部クロールするようになっています。
開発が続くとどんどんコミットが増えていくので、コマンドの実行が重くなっていきます(泣)
>> git subtree push --prefix _site/ origin master
git push using: engine-remote master
-n 1/ 1193 (0)
-n 2/ 1193 (1)
-n 3/ 1193 (2)
...
-n 1193/ 1193 (1152) <-これがどんどん増える。。
Counting objects: 176, done.
...
経緯
GitHub PagesでJekyllで作成したサイトを表示しています。
一番簡単なのは、Jekyllプロジェクトをそのままリポジトリに突っ込む方法です。
ただ、今回はGitHub Pages側では対応していないプラグインを使いたかったので、
jekyll buildで生成した静的サイト(_siteディレクトリ以下)をリポジトリに渡していました。
そのままリポジトリ内でjekyll buildしただけではプロジェクトのルートに_siteが生成されてしまい、GitHub Pages側に参照させることができません。
_siteだけgitの管理下に置くという方法もありますが、個人的にプロジェクトごと管理したかったので、違う方法を取りました。
参考 ↓↓↓↓
Github pagesで意地でもサブディレクトリをルートにする
現在はプロジェクトに対して、developブランチ(メイン)、masterブランチ(_siteディレクトリのみ、コイツが表示される)で管理しています。
更新後developブランチでコミットし、
>> git subtree push --prefix _site/ origin master
でGitHub Pagesが参照しているmasterブランチに_siteの中身だけpushしています。
しかし、この状態で開発をしていると、前述の通りどんどん処理が重くなっていきます。。。
対処法
>> git subtree push --prefix _site/ origin master
を以下に置き換えます。
>> git subtree split --prefix _site/ --rejoin --branch subtree_branch
>> git push origin subtree_branch:master
なにしてるの?
git subtree pushでは、git subtree splitとgit pushをやってくれるのですが、
subtree splitを実行時に、コミットをクロールしています。
このクロール対象は、git subtreeを実行した際に付くコミットメッセージの内容から判断されます。
そのコミットメッセージが無いと、すべてのコミットをクロールしてしまいます。
これを避けるため、subtree split実行時に--rejoinオプションで、コミットメッセージを付けさせる事により、クロール対象を最新のコミットのみに絞っています。
なおsubtree_branchは、git subtree pushの処理を分けて書くために作成している一時的なブランチです。