git submoduleをよくわからないままに使う

vim関連ファイルの管理を見直した.
具体的には,以下のようなことを行った.

  • pathogen.vimからneobundle.vimへ移行
  • DropBoxでの管理からGitHub管理へ移行
  • ステータスラインを独自のものからvim-powerlineへ移行

この中で,1,2に関連してgit submodule機能を使う必要があり
しかも使い方がよくわからず,わからないままに現在運用している.
正しい運用方法を知っている人がいたら是非教えて欲しい.

neobundle.vimのインストール

以前はpathogen.vimというツールでプラグインを管理していのだが
よりモダンらしいneobundle.vimを使って管理することにした.
neobundle.vimでは.vimrcに次のように記述し
:NeoBundleInstallというコマンドを実行することで
githubやその他vimプラグイン管理サイトからプラグインを
ズルズルインストールすることが出来る.

僕がインストールしているプラグインはこんなかんじ.

NeoBundle 'git://github.com/Shougo/neocomplcache.git'
NeoBundle 'git://github.com/Shougo/neobundle.vim.git'
NeoBundle 'git://github.com/Shougo/unite.vim.git'
NeoBundle 'git://github.com/Shougo/neocomplcache-snippets-complete.git'
NeoBundle 'git://github.com/anyakichi/vim-surround.git'
NeoBundle 'git://github.com/vim-scripts/tComment.git'
NeoBundle 'git://github.com/vim-scripts/Align.git'
NeoBundle 'git://github.com/Lokaltog/vim-powerline.git'
NeoBundle 'git://github.com/mattn/webapi-vim.git'
NeoBundle 'git://github.com/basyura/twibill.vim.git'
NeoBundle 'git://github.com/tyru/open-browser.vim.git'
NeoBundle 'git://github.com/h1mesuke/unite-outline.git'
NeoBundle 'git://github.com/basyura/bitly.vim.git'
NeoBundle 'git://github.com/basyura/TweetVim.git'
NeoBundle 'git://github.com/mattn/zencoding-vim.git'

構成は下のようなかんじ.

dotfiles
  ├── .vim
  │   ├── autoload
  │   ├── bundle
  │   │   └── neobundle.vim
  │   ├── doc
  │   │   └── tags
  │   ├── neobundle
  │   │   ├── .neobundle
  │   │   ├── Align
  │   │   ├── TweetVim
  │   │   ├── bitly.vim
  │   │   ├── neocomplcache
  │   │   ├── neocomplcache-snippets-complete
  │   │   ├── open-browser.vim
  │   │   ├── tComment
  │   │   ├── texput.log
  │   │   ├── twibill.vim
  │   │   ├── unite-outline
  │   │   ├── unite.vim
  │   │   ├── vim-powerline
  │   │   ├── vim-surround
  │   │   ├── webapi-vim
  │   │   └── zencoding-vim
  │   └── plugin
  │        └── python_fold.vim
  ├── .gvimrc
  └── .vimrc

neobundle.vimだけbundleディレクトリに入ってて その他はneobundleディレクトリへ.

githubでのdotfiles管理

以前はDropBoxにdotfiles系のファイルを突っ込んでUbuntuでもWindowsでもMacOSXでもなんでもDropBoxで同期を行なっていたが,サーバーOSで動くことも多くなってきたのでgithubに移行することに.

kuhataku/dotfiles · GitHub

GitHub Links GitHub About Blog Features Contact & Support Training GitHub Enterprise Site Status Cli...

https://github.com/kuhataku/dotfiles

これで,cloneしてシンボリックリンクを貼れば使えると思っていたのだが

Cloneしてみた

git clone git://github.com/kuhataku/dotfiles

vimを起動してみると,プラグインが一切ない.
:NeoBundleInstallコマンドを実行してみたが
コマンドが実行できない.neobundle.vimがインストールされていない.
実際,bundle/neobundle.vim/の中身を見てみると,
.gitなどのファイルを除いて空っぽ.
実体のないディレクトリが作られていた.
githubから見てみても同様だった.

どうやらgitでは,外部レポジトリを取り込んだ 自分のレポジトリを作るには,cloneするだけではだめなようである.

gitで外部モジュールを取り込むには【よくわかっていない】

これが,git submoduleというやつらしい. cloneではなく,次のようにして,プラグインを取り込む.

git submodule add [repository URL]
cd [repository]
git init
git update

init=>updateを行わないと,repositoryの中身が落ちてこない.
これは,git cloneした後も同様であり,init=>updateする必要がある.
neobundle.vimについてこれを行うと,確かに
repositoryの中身が取得され,また別マシンでcloneした時に
中身を取ってくることができた.
また,github上では,元repositoryへのリンクとして表示されるようになった.
なんとなく,この表示からして,cloneする時はrepository元から
データがcloneされてくるのではないだろうか.

git submoduleを使ったvim管理

外部レポジトリの取り込み方はわかった.
しかし,全てのvimプラグインに対してsubmodule系コマンドを実行するのは嫌だ.
addもinitもupdateも嫌だ.
(折角NeoBundleInstallで超ベンリにインストールできてるのに) br

そこで,submoduleとして管理するのはneobundle.vimrcだけにして
プラグインについては,新しい環境を作るたび:NeoBundleInstallを実行することにした.
これなら比較的許容できる作業量である.

わからないところ

これで,一応それなりの管理はできたが
使っていて???なところもあるので列挙しておく

git submoduleコマンドでWarning

git submoduleコマンドは,レポジトリに含まれる
submoduleを表示するコマンドあるが,次のような表示がでる.

4d025ed28584b1aa05588794d92ed617fa925680 vim/.vim/bundle/neobundle.vim (ver.1.0-54-g4d025ed)
No submodule mapping found in .gitmodules for path 'vim/.vim/neobundle/Align'

1行目は,neobundle.vimをsubmoduleにしているということ.
問題は2行目で,NeoBundleを使ってインストールしたAlign.vimがsubmoduleになってない,という旨が表示されている
どうも,submoudleで導入していない外部レポジトリをgit addするとこのように表示されるようだ.
別段問題になっているわけではないが,気持ちが悪い.

外部レポジトリが消えたらどうなるのか

レポジトリに外部レポジトリを取り込んでいるのならいいものの,
github上では,レポジトリのリンクとして扱われているので
取り込んでいるレポジトリがgithub上からデータを消したら
もうcloneすることができなくなるのでは?