我知道很多人将.vimrc存储在GitHub上,以便更轻松地开始在新计算机上工作,这对我来说完全有意义。但是,包括插件是有问题的,因为我使用的插件已经是git存储库。如何创建一个可同时跟踪其.vimrc和任何可能安装的插件的存储库?
我知道很多人将.vimrc存储在GitHub上,以便更轻松地开始在新计算机上工作,这对我来说完全有意义。但是,包括插件是有问题的,因为我使用的插件已经是git存储库。如何创建一个可同时跟踪其.vimrc和任何可能安装的插件的存储库?
Answers:
如何处理存储库中的存储库一直是git的问题。Git的子模块是解决这种情况的一种方法,但代价是要增加一些复杂性以进行跟踪。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
,a 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
会将其视为来自其存储库的特定提交。在查看该路径的差异或日志(例如git log -1 -u .vim/bundle/vim-elixir
)时,git会将其显示为单行字符串,如下所示:
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
或者,您可以在调用之前将FAQ中的此代码段添加到vimrc文件中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脚本网站安装脚本,但是这些脚本已镜像到GitHub,因此无需这样做。
这样做还具有其他一些优点,例如,更容易更新插件以及按需加载以提高性能。您也不会冒违反与vimrc文件一起分发的插件的许可条款的风险。
也可以看看:
我将vimrc存储在github中,并将插件作为存储库的子模块存储。
在readme.md文件中,我放了一根衬里,拉出存储库,然后运行安装脚本,这样我就可以将一行复制到编辑器中,并进行所有设置。它所做的不只是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,一种方法可能是使用Git子模块。当您添加子模块时,git会将其识别为来自另一个存储库,并保留其内容(除非对其进行了更改,在这种情况下,当您这样做时,它将显示为具有未跟踪的内容git status
)。如果您所有基于Github的插件都在中bundle/
,则将它们添加为子模块是一个非常简单的任务,并具有良好的shell:
for f in bundle/*/
do
git submodule add $(awk '/url =/{print $3}' "$f/.git/config") "$f"
done
您可以查看一下vimrc repo中子模块的显示方式。
如果将文件添加到子模块,或进行了一些不影响存储库的更改,git status
仍然会抱怨子模块具有未提交的更改或未跟踪的文件。您可以通过添加ignore = dirty
到.gitmodules
文件中的子模块配置来使git忽略此类更改。例如:
[submodule "bundle/LaTeX-Box"]
path = bundle/syntastic
url = https://github.com/scrooloose/syntastic.git
ignore = dirty
子模块的一个好处是,该子模块的修订版已添加到git存储库中,因此a会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
最后,一个命令将它们全部更新!
git submodule foreach git pull
您只需将以下行添加到您的代码中.gitignore
即可忽略所有插件,而不提交它们:
vim/bundle
另外,您说过要包含插件代码是有问题的,因为它们已经是github repos。我猜你的意思是你不想要复制的代码,但我听说,你应该继续和重复的代码,这是一个依赖,让您可以随时返回到一个特定的点在你的代码,并知道这它会工作。以下是James Shore发表的一些文章:http : //www.letscodejavascript.com/v3/blog/2014/12/the_reliable_build,http : //www.letscodejavascript.com/v3/blog/2014/03/ the_npm_debacle。他在谈论编程代码和npm(与vim相对),但是我认为该论点仍然适用,您需要一个可靠的环境来进行编码或写入。