Home > Vim Hacks > Hack #101: gitリポジトリの内容を参照する

Hack #101: gitリポジトリの内容を参照する

問題

gitを利用して開発を行なっていると、 しばしば現在作業中のブランチとは 別のブランチのファイルを参照したいときがあります。

git show {branch}:{path-to-a-file} で特定のブランチのファイルを出力できるので、 Vimからは

:new
:read !git show {branch}:{path-to-a-file}

とすれば問題のファイルの内容を参照することはできますが、手順が面倒です。 それに多数のブランチが存在する場合や参照したいファイルへのパスが長い場合は コマンドの入力にも苦労します。 どうにかして簡単に参照することはできないでしょうか。

解決方法

metarw-git を利用します。

例えば「あるブランチのファイル」は以下のようにして参照することができます。

:edit git:{branch}:{path-to-a-file}

:editだけでなく、 :read:sourceといった ファイル名を引数として取るコマンドならば 同様にして内容を参照することができます。

git:{branch}:{path-to-a-file}の使用例

また、Vimでは標準でディレクトリの内容を「開く」ことができますが、 これと同様に「あるブランチのディレクトリの内容」も参照することができます。 これには以下のようなパスを用います。

:edit git:{branch}:{path-to-a-directory}

git:{branch}:{path-to-a-directory}の使用例

さらに、ディレクトリに対するファイル/ディレクトリと同様に、 gitリポジトリ内に存在するブランチも参照することができます。 これには以下のようなパスを用います。

:edit git:

git:の使用例

以上の例では説明と簡単にするため 「あるブランチの内容」という表現をしましたが、 実際にはブランチに限らず任意のコミットオブジェクト (に付随するツリーオブジェクト)の内容を参照することができます。 ですので、metarw-gitを利用して 現在開いているファイルの一つ前のバージョンを開く といったことも可能です。

解説

Vimでは各種イベントに応じて任意のコマンドを自動的に実行することができます (:autocmd)。 metarw-gitではこれを利用して、 git:{branch}:{file}のような実際には存在しないファイルが 読み書きされる際にgitリポジトリから適切な内容をバッファへ読み込むことで、 あたかもそのようなファイルが存在するかのようにVimを拡張しています。

例えばVimでは標準で ディレクトリやzipなどのアーカイブファイルの内容を閲覧したり、 それに含まれるファイルなどの内容を「開く」ことができるように なっていますが、 その機能は標準添付されているプラグインにより実現されており、 各プラグインではmetarw-gitと同様に:autocmdを駆使して処理を行なっています。

なお、metarw-gitなどのプラグインが行なっている 「ファイルでないものを普通のファイルであるかのように扱う」 処理は実際に実装するとなるとかなり煩雑です。 この点を抽象化した metarw というライブラリがあり、 metarw-gitはそれを利用して作られています。

参考資料

kana
このエントリーをはてなブックマークに追加
はてなブックマーク - Hack #101: gitリポジトリの内容を参照する
Share on Facebook
Post to Google Buzz
Bookmark this on Google Bookmarks
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Share on FriendFeed

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://vim-users.jp/2009/11/hack101/trackback/
Listed below are links to weblogs that reference
Hack #101: gitリポジトリの内容を参照する from Vim-users.jp

Home > Vim Hacks > Hack #101: gitリポジトリの内容を参照する

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top