@kyanny's blog

Write down what I learnt.

オレオレ Git サブコマンドを作る

今日同僚と「git copy ってないの?」「ないすよ」という話をして、そういえば svn のころの癖でつい git help copy などと探してしまうし、別にあっても害はないかなと思って git-copy を作ってみた。

https://github.com/kyanny/git-copy

なんのことはない、単に cp(1) を実行するだけなんだけど、 Git は git-* という名前の実行ファイルを PATH の通ったところに置いておくと勝手にサブコマンドとして認識してくれるので*1、このように手軽にオレオレ Git サブコマンドを作ることができる。

git-copy は仕事の息抜きにちょろっと書いてみたジョークコマンドだけど、世の中には git-dailygit-now のような実用的なツールも存在する。もちろんサブコマンド化などせず独自の便利ツールを作ってもいいのだけど、慣習に従ってみるのも悪くない。 git foo bar のように実行できるとビルトインの機能と区別がつかないため、慣れるのもはやそうだ。複数行にわたる複雑な便利エイリアスを使っていたり、エイリアスが破綻したのでシェルスクリプトに切り出したりしている人は、いっそサブコマンド化してしまったらどうだろう。ついでに github か bitbucket あたりで公開してくれると喜ぶひとがいそう。

余談だが、なぜ git copy がないのかについてはSubversion と Git/Mercurial/Bazaar は全く別物 - tcha.orgを読むといいかもしれない。 Git はコンテンツ VCS だから、とあるが、どこかで「Git はファイルではなくコンテンツを追跡するので、ファイル名の変更などは内部でよしなに判断してくれるから、ファイル名変更の前後で『これらのファイルは同じ歴史を持つよ』とわざわざ教えてあげる必要はなく、したがって git copy は不要である」という話を読んだ覚えがある。入門Gitだったかな。

*1:http://labs.gree.jp/blog/2011/05/3528/ で知った。ドキュメントのどこに書いてあるかは探せなかった