git rebase -i のインターフェースについて

ちょっと前の下書きから。


そもそもの発端はShougoさんが git rebase -i の
あのエディタを立ち上げてしまうインターフェースはxxxだ、というようなことを言っていたことから。

対話的なプログラムは他のプログラムから呼び出しにくい(Vimからとか)。
まぁ便利なのはわかるけど、自分もそう思っていたので、なんとなく代替となるインターフェースをぐだぐだ考えてみた。

git-drop-commits {commit} [{commit} ...]

  • 特定コミットを削除
  • 複数指定可能

git-swap-commits {from} {to} [{from} {to} ...]

  • コミットを入れ替え
  • 複数指定可能
  • 入れ替えるコミットを交互にコマンドラインで与えてって、入れ替えた最終的に並んだコミットのようにする
  • git rebase -iに渡すために最初の親となる部分を覚えておく必要がある

git-fixup-commits {since}..{until}

エディタが立ち上がった時に指定するfixupみたいな。
範囲を与えると、一番最初のコミットと全部一緒くたにする。

git-squash-commits {since}..{until}

ぶっちゃけsquashよりもfixupしか使わない感じなのであんまりいらない。
というかコミットログを書くためにエディタが起動するけど、あれはどうするかな。
全部(というかだいたいは1,2個だろうけど)に対してコメントを指定するのは面倒。

git-reword {commit} {msg}

コミットログを書き換え。

git-detach

エディタが立ち上がった時に指定するeditみたいな。
名前はsubmoduleを扱ったりするとなったりするdetached HEADから。*1
なんか微妙に単語間違えてる気がしなくもない。

git rebase -i

そしてgit rebase -iはこれらを内部的に扱うインタラクティブなインターフェースであればいいと思った。
git rebase -iがこういうインターフェースになってる以上、
それぞれのサブコマンドに対して$GIT_EDITORに設定するプログラムを作る必要がありそう*2

結局

と、ここまで考えて結局本体になきゃ他のプログラム(Vimとか)から気軽に呼べないのでやっぱxxxだな、と思った。


あとリンク元でthincaさんがcrontabの例で言ってるように
せめてファイルを受けつけてほしいなーとか。

*1:man git-checkout 参照。git checkout {commit} とかするとできる

*2:実際にはある程度共通化できるだろうけど、自分の頭じゃ実際作ってかないとどの程度共通化できるかわからない