vimプラグインをgitのsubmoduleで管理

2011/07/06追記

今はsubmoduleでなく、vundleを使ってます。
vundleでvimのプラグインを管理 - うんたらかんたら日記


git submodule

参考

git 1.6.0.2 submoduleを使おう!その1:add, status - satoko's blog - s21g
git 1.6.0.2 submoduleを使おう!その2 - satoko's blog - s21g


こんな感じで使うと。

$ git submodule add  git://github.com/dchelimsky/rspec.git vendor/plugins/rspec

$ git submodule status
-fd553b85af3da59a35cf8366319fb244fc4172b5 sub/rspec

$ git submodule update --init

$ git submodule update

じゃvimのプラグインを管理しよう

submoduleの使い方は分かったので、vimプラグインをsubmoduleで管理してみる。
Tips – Using git submodule keep your vim plugin up-to-date | DIG RUBY



vimプラグインの管理 - うんたらかんたら日記
↑この状態(pathogenできれいにした状態)からsubmodule化して管理してみます。

git submodule add

管理対象の一覧。

$ cd .vim
$ find . -name .git -depth 2
./git-vim/.git
./nerdcommenter/.git
./snipmate.vim/.git
./vim-cucumber/.git
./vim-endwise/.git
./vim-pathogen/.git
./vim-quickrun/.git
./vim-rails/.git
./vim-ruby/.git
./vim-surround/.git

matchit と vim-fuzzyfinder だけvim.orgから持ってきたんだけど
githubで探してみたらありました。


edsono's vim-matchit at master - GitHub
vim-scripts's FuzzyFinder at master - GitHub

これで全部submodule管理できる。


git submodule add するために、.git/configに書かれている内容をリストアップ。

$ find . -name 'config' | xargs cat | grep url | awk '{print $3}'
http://github.com/motemen/git-vim.git
http://github.com/scrooloose/nerdcommenter.git
http://github.com/msanders/snipmate.vim.git
git://github.com/tpope/vim-cucumber.git
http://github.com/tpope/vim-endwise.git
http://github.com/tpope/vim-pathogen.git
http://github.com/thinca/vim-quickrun.git
git://github.com/tpope/vim-rails.git
http://github.com/vim-ruby/vim-ruby.git
http://github.com/tpope/vim-surround.git


む?
なんかプロトコルばらばらやん。
別に問題ないけど、ブラウザでgithubを一通り見るとhttpsになってるようなので、一括置換します。


実行コマンドを出力。

$ find . -name 'config' | xargs cat | awk '/url/ {print $3}' | ruby -ne '$_ =~ /(.+:)(.+)\/(.+)\.(.+)$/; puts "git submodule add https:#{$2}/#{$3}.#{$4} vim/bundle/#{$3}"'

git submodule add https://github.com/motemen/git-vim.git vim/bundle/git-vim
git submodule add https://github.com/scrooloose/nerdcommenter.git vim/bundle/nerdcommenter
git submodule add https://github.com/msanders/snipmate.vim.git vim/bundle/snipmate.vim
git submodule add https://github.com/tpope/vim-cucumber.git vim/bundle/vim-cucumber
git submodule add https://github.com/tpope/vim-endwise.git vim/bundle/vim-endwise
git submodule add https://github.com/tpope/vim-pathogen.git vim/bundle/vim-pathogen
git submodule add https://github.com/thinca/vim-quickrun.git vim/bundle/vim-quickrun
git submodule add https://github.com/tpope/vim-rails.git vim/bundle/vim-rails
git submodule add https://github.com/vim-ruby/vim-ruby.git vim/bundle/vim-ruby
git submodule add https://github.com/tpope/vim-surround.git vim/bundle/vim-surround

awkで一発で取れないかと試行錯誤したけど、修行が足りないようで結局rubyを使いました。


githubから取得し直すので、ディレクトリを新規追加後、上記git submodule addを実行。

mv vim/bundle vim/bundle_bk
mkdir vim/bundle
git submodule status
$ git submodule status
-b2a32b9cfc1037c6adfbcfdcb2d37290484e41e4 vim/bundle/git-vim
-930be32a23e902ddc46135ddbb9e76b0fac0c14b vim/bundle/nerdcommenter
-f5a75d075d3c005ebe69e3f5e56cf99516e8aa3b vim/bundle/snipmate.vim
-35b4a3ea17bab837540c7d371d3bd71b5d46eaf5 vim/bundle/vim-cucumber
-780fa5603c0917d9b22e3b64dd8ab0423e006eb5 vim/bundle/vim-endwise
-968e87ef7fa5ce19dbd3ffe23f0e0d58d88fae43 vim/bundle/vim-pathogen
-a8080199b48b4886139dcd59bf087fdfecb8809a vim/bundle/vim-quickrun
-26dade8251a07da3d78467bcbc08bd1b2767008d vim/bundle/vim-rails
-d6f99550574f6ce1e400cf49796eb6de17be44ff vim/bundle/vim-ruby
-27710a2224d6dd0486d1c40d09ef18dd752e7d37 vim/bundle/vim-surround

あとは、git submodule update --init。

doc/tags

これでお終いと思ったけど、git statusするとuntracked contentというメッセージが。

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#       modified:   vim/bundle/git-vim (untracked content)
#       modified:   vim/bundle/snipmate.vim (untracked content)
#       modified:   vim/bundle/vim-quickrun (untracked content)
#       modified:   vim/bundle/vim-ruby (untracked content)
#       modified:   vim/bundle/vim-surround (untracked content)


submodule化したプラグイン内でdoc/tagsってファイルが作成される。
これを管理対象としたいのだが、どうしたもんかと調べてみると
globalの gitignoreに設定する方法が紹介されていた。
.gitignoreを複数プロジェクトで共有する。 - redtower's memo

$ vim ~/.gitignore
doc/tags
doc/tags-ja

$ git config --global core.excludesfile ~/.gitignore

なるほど。
思ったより時間が掛かったが、なんとかできた。


rochefort's dotfiles at master - GitHub

補足

追記

FuzzyFinderを追加すると下記エラーとなった。

Error detected while processing /Users/rochefort/Dropbox/github/dotfiles/vim/bundle/FuzzyFinder/plugin/fuf.vim:
line   13:
***** L9 library must be installed! *****
Press ENTER or type command to continue


L9という別プラグインを使用しているようで
L9 - Vim-script library : vim online
これを追加するとうまくいきました。


clones's vim-l9 at master - GitHub

git submodule add https://github.com/clones/vim-l9.git vim/bundle/vim-l9
git submodule init

さらに追加

vundleでvimのプラグインを管理 - うんたらかんたら日記
submoduleの削除。

.gitmodule
.git/config
git rm --cached path_submodule

さらにさらに追加

git submoduleの更新 - うんたらかんたら日記
submoduleのpull。

$ git submodule foreach 'git pull origin master'
$ git submodule update
$ git submodule foreach 'git checkout master; git pull'
$ git submodule update