前回の Brewfileについての記事 を書くにあたり、
とりあえずどこかにコミットしておけばいいやくらいの軽い気持ちで
ウカツにも 自分のdotfiles管理レポジトリ にコミットして作業を続けてきたわけですが、
Brewfileの管理はやっぱ別レポジトリのほうがいいよなと思いレポジトリを移行することにしました。
その際にファイルをただコピーペーストするのでなく、
コミットログを残しておきたかったので filter-branch コマンドで各コミットを編集しました。
自分用の備忘録を兼ねて公開する次第です。
git filter-branch
filter-branchコマンドは複数のコミットに対して特定の操作を一括して行うコマンドです。
Gitの公式ドキュメント
いわく 最強のオプション です。
記されているとおり 破壊的な作業を行うことができるので取り扱いには要注意 です。
作業概要
dotfiles レポジトリにコミットされている
home/Brewfile を
brewfile レポジトリを新規作成して Brewfile としてコミットします。
brewfile レポジトリを作成する
まずは brewfile レポジトリを作成します。
新規作成するのではなく dotfiles レポジトリをコピーします。
brewfileのレポジトリの大元ができましたので以降はそこで作業します。
Brewfileがコミットされている場所を移動する
現在Brewfileが home/Brewfile へコミットされているので、
ディレクトリ直下に移動させたいです。
そこで git filter-branch に –subdirectory-filter オプションを指定します。
subdirectory-filterに特定のディレクトリを指定することでそのディレクトリ以下の
コミットのみを抽出することができます。
これで移動ができました。ですがまだ不要なコミット、ファイルが含まれています。
Brewfileの編集が含まれるコミットだけ抽出する
Brewfileに関するコミットのみ抽出するためにファイル名を指定します。
この際、すでに filter-branch を実行しているためバックアップが存在しているため
–force オプションを指定する必要があります。
Brewfileが含まれるコミットだけが抽出されました。
Brewfile以外のファイルを削除する
最後に –tree-filter オプションを指定します。
tree-filterにコマンドを指定することで各コミットにそのコマンドを適用します。
Brewfile以外を削除していきましょう。
この調子で不要ファイルを削除していきます。
これで不要コミット、不要ファイルが削除されてBrewfileだけのコミットログが完成しました!
完成したレポジトリ
おわり
今回のまとめ
- filter-branch を正しく使うと便利
- そもそもコミットは適切な場所に適切な粒度でしましょうねという話