多くの人が.vimrcをGitHubに保存して、新しいマシンでの作業を簡単に行えるようにしていることを知っています。ただし、使用するプラグインはすでにgitリポジトリであるため、プラグインを含めることには問題があります。.vimrcとインストールされる可能性のあるプラグインの両方を追跡するリポジトリを作成するにはどうすればよいですか?
多くの人が.vimrcをGitHubに保存して、新しいマシンでの作業を簡単に行えるようにしていることを知っています。ただし、使用するプラグインはすでにgitリポジトリであるため、プラグインを含めることには問題があります。.vimrcとインストールされる可能性のあるプラグインの両方を追跡するリポジトリを作成するにはどうすればよいですか?
回答:
リポジトリ内のリポジトリをどのように扱うかは、gitの継続的な疑問です。Gitのサブモジュールは、状況に対処する1つの方法ですが、追跡するためにもう少し複雑さが追加されます。gitサイトにはサブモジュールの紹介があります。
基本的な考え方は、リポジトリのパスに関連付けられた別のgitリポジトリへの参照を保持することです。これらの参照は.gitmodules
、リポジトリのルートにあるファイルに保存されます(gitで管理されているため、そのままにしておきます)。サブモジュールを含むレポを複製する場合、複雑さの一部がgit submodule init
発生し.gitmodules
ます。明示的にファイルを作成してgit submodule update
からサブモジュールを複製する必要があります。
サブモジュールを使用して、新しいvimプラグインをdotfilesリポジトリに追加する方法(~/.vim/
このリポジトリのエイリアスを.vim/
作成しました)のチュートリアルを次に示します。
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
後はsubmodule add
、git status
あなたが変更された(または作成)したことを示すだろう.gitmodules
。このようなもので、ファイルを:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
また.vim/bundle/vim-elixir
、新しいファイルとして表示されるはずです。Gitは現在、そのパスを特別に扱います。これはファイルシステム上の通常のディレクトリです(したがって、vimは通常通りにロードします)がgit diff
、リポジトリからの特定のコミットとして扱います。そのパスのdiffまたはログを見ると(たとえばgit log -1 -u .vim/bundle/vim-elixir
)、gitはそれを次のような1行の文字列として表示します:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
プラグインの最新バージョンへの更新は、サブモジュールのリポジトリに入り、新しいコミットをチェックアウトし、それをリポジトリにコミットすることに対応します。
$ cd .vim/bundle/vim-elixir
$ git remote -v # note: the submodule repo's origin, not my repo's
origin https://github.com/elixir-lang/vim-elixir.git (fetch)
origin https://github.com/elixir-lang/vim-elixir.git (push)
$ git pull
# ...
$ cd - # back to my repository's root
$ git status
# ...
modified: .vim/bundle/vim-elixir (new commits)
$ git diff .vim/bundle/vim-elixir
# ...
-Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
+Subproject commit d59784e7afbd0d55c501e40c43b57cbe6f6e04c2
$ git commit -m "update vim-elixir" .vim/bundle/vim-elixir
VCSにプラグインを保存する必要はありません。Vimパッケージマネージャーを使用することもできます。昨日から、私はvim-plugを使用しています:
次のように、vimrcでプラグインを定義できます。
call plug#begin('~/.vim/plugged')
Plug 'embear/vim-localvimrc'
Plug 'kchmck/vim-coffee-script'
" ... etc
call plug#end()
次に、Vimを再起動し、次のプラグインをインストールします。
:PlugInstall
または、呼び出し前に、vimrcファイルにFAQからこのスニペットを追加できplug#begin()
ます。
if empty(glob('~/.vim/autoload/plug.vim'))
silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall
endif
これにより、プラグインがに配置され~/.vim/plugged
ます。VCSにこのファイルを保持する必要はありません。このvimrcを別のマシンで使用する場合は:PlugInstall
、そのマシンで呼び出してください。
プラグインを削除するには、vimrcファイルからプラグインを削除して実行します:
:PlugClean
vim-plugはVimスクリプトWebサイトからのスクリプトのインストールをサポートしていませんが、それらのスクリプトはGitHubにミラーリングされているため、そうする必要はありません。
これには、プラグインの更新が簡単になる、パフォーマンスを向上させるためのオンデマンドロードなど、追加の利点もあります。また、vimrcファイルで配布しているプラグインのライセンス条項に違反する危険もありません。
こちらもご覧ください:
vimrcをgithubに、プラグインをリポジトリのサブモジュールとして保存します。
readme.mdファイルに、リポジトリをプルし、セットアップスクリプトを実行する1つのライナーを配置します。これにより、エディターに1行コピーし、すべてをセットアップできます。vimだけではありません(しかし、それほどではありません)。
https://github.com/Loki-Astari/UnixConfig
使用するには:
cd
git clone git@github.com:Loki-Astari/UnixConfig.git ~/.config
cd .config
git submodule init
git submodule update
chmod +x init
./init
cd
PS。アドバイスを喜んで受けます(これは何年も前にやったので、それ以降は触れていません)。
注:私のお気に入りの部分は、gitもセットアップし、vimをgitの差分ツールとして使用するようにセットアップすることです。Vimdiffは最高のdiffツールです。
Pathogenに固執したい場合、1つの方法はGitサブモジュールを使用することです。サブモジュールを追加すると、gitはそれを別のリポジトリからのものとして認識し、その内容をそのままにします(変更されていない限り、その場合、追跡されていないコンテンツがあると表示されますgit status
)。すべてのGithubベースのプラグインがにbundle/
ある場合、それらをサブモジュールとして追加するのは、優れたシェルを備えた非常に簡単なタスクです。
for f in bundle/*/
do
git submodule add $(awk '/url =/{print $3}' "$f/.git/config") "$f"
done
私のvimrcリポジトリでサブモジュールがどのように表示されるかを見ることができます。
サブモジュールにファイルを追加したり、リポジトリに影響を与えgit status
ない変更を行ったりしても、コミットされていない変更や追跡されていないファイルがサブモジュールにあると文句を言います。ファイルのignore = dirty
サブモジュール構成に追加することで、gitにそのような変更を無視させることができ.gitmodules
ます。例えば:
[submodule "bundle/LaTeX-Box"]
path = bundle/syntastic
url = https://github.com/scrooloose/syntastic.git
ignore = dirty
サブモジュールの利点の1つは、サブモジュールのリビジョンがgitリポジトリに追加されるためgit init
、特定のリビジョンのチェックアウトが自動的に処理されることです。それを捨ててignore = all
、.gitmodules
ファイル内の構成に追加することでサブモジュールを追加したら、gitにサブモジュールを無視するように指示できます。例えば:
[submodule "bundle/LaTeX-Box"]
path = bundle/LaTeX-Box
url = https://github.com/LaTeX-Box-Team/LaTeX-Box.git
ignore = all
最後に、それらをすべて更新する1つのコマンド!
git submodule foreach git pull
この行をに追加するだけで、.gitignore
すべてのプラグインを無視し、コミットしません。
vim/bundle
また、プラグインコードが既にgithubリポジトリであるため、プラグインコードを含めるのは問題だとおっしゃいました。私はあなたがコードを複製したくないことを意味推測するが、私が聞いた、それはあなたが常にあなたのコード内の特定のポイントに戻ってできるように、あなたが先に行くと依存だ重複コードべきであると述べた知っていることをそれが動作します。ここではジェームズ・ショアいくつかの記事があるということについての話:http://www.letscodejavascript.com/v3/blog/2014/12/the_reliable_build、http://www.letscodejavascript.com/v3/blog/2014/03/ the_npm_debacle。彼は(vimではなく)プログラミングコードとnpmについて話しているが、議論はまだ当てはまると思う。