Gitのsubmoduleにまつわるsymlink問題、あとvital.vimのvitalizer
vital.vimとか知らない人は送ったpull reqの説明呼んだ方が分かりやすいです。
事象
- emap.vimの実行時にエラーが出るため、素のVimで立ち上がるようになってしまった
- とりあえずemap.vimを前回のバージョンに戻した
- プラグイン有りのVimを起動
- emap.vimのリポジトリで「:Vitalize . Mapping Data.List」したら以下のようなエラー。
Could not retrieve current HEAD: vitalizer: 'git --git-dir "C:/Users/takuya/vimfiles/bundle/vital.vim/.git" rev-parse HEAD' failed: fatal: Not a git repository: C:/Users/takuya/vimfiles/bundle/vital.vim/../../../../.git/modules/dotfiles/.vim/bundle/vital.vim
「C:/Users/takuya/vimfiles」はtyru/dotfilesの「dotfiles/.vim」フォルダへのジャンクション。
Gitのsubmoduleの仕様上、submoduleのリポジトリの「.git」はディレクトリではなくファイルであり、中身に相対パス(gitdir: ../../../../.git/modules/dotfiles/.vim/bundle/vital.vim)が書かれていて、.gitディレクトリの実体は親リポジトリの「.git/modules/<トップレベルからの相対パス>」である。*1
しかしこの仕様はジャンクションや、おそらくUnix系においてもsymlinkなどで構成によっては存在しないパスを参照することがあり得る。
(「C:/Users/takuya/vimfiles/bundle/vital.vim/../../../../.git/modules/dotfiles/.vim/bundle/vital.vim」は「C:/Users/.git/modules/dotfiles/.vim/bundle/vital.vim」となるため)
今回はその問題にぶち当たってしまった。
とりあえず手動でvitalizeの処理をしようと思った*2が、うまくいかなかった。*3
vitalizer.vimの「s:vital_dir」の値がジャンクションを含む値となっていることが問題なので、
「s:vital_dir」を直接リテラル値で正しいパスに変更して「so
総感
Gitの世界で解決するべきか、
それともGitを扱う以上vitalでもこういった問題をサポートするべきか。
ただこれはGit固有の問題ではなさそうだし、そもそもパスを連結する時に全てのディレクトリのsymlinkを解決してたら遅くなってしまう。
ただ以前のようにsubmoduleの.gitディレクトリがリポジトリの中に直接存在していれば問題は起きなかったはずで、なぜ仕様変更したのか気になるところ。
vital.vim側の対応
とりあえずvital.vim側の対応として、vital.vimに前述した「s:vital_dir」の値を変えられるグローバル変数を追加したpull reqを送った。