問題
メインの開発ブランチから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
の処理を分けて書くために作成している一時的なブランチです。