适用于.vimrc和插件的GitHub


21

我知道很多人将.vimrc存储在GitHub上,以便更轻松地开始在新计算机上工作,这对我来说完全有意义。但是,包括插件是有问题的,因为我使用的插件已经是git存储库。如何创建一个可同时跟踪其.vimrc和任何可能安装的插件的存储库?


我觉得这可能太以意见为导向;没有客观的“最佳”选择,有很多好的选择,每种选择都有其优缺点。同样,有关嵌套存储库的一点点将问题更多地归入“ using git”类别,而对vim的关注则更少。也许如果您在尝试将配置存储在github上时将注意力集中在vim或vim插件遇到的特定问题上呢?

3
如果您愿意,我可以对其进行编辑以发挥出最佳效果;我的意图是问更多“我该怎么做?” 问题,同时承认我思考问题的方式可能并不理想。
汤姆(Tom)

这可能会有所帮助,但这可能只是使它成为“事物清单”问题(同样,有很多不同的方法可以有效地做到这一点)。如果您想为关于如何处理此类问题的讨论做出贡献,那么当前有一个关于此类问题的meta主题

2
编辑。我希望我已经更清楚地问我:“我该怎么做?”
汤姆(Tom)

1
只需使用像neobundle这样的插件管理器即可。
菲利普(Philip)

Answers:


18

如何处理存储库中的存储库一直是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

谢谢,这看起来就像我想要的东西!
汤姆(Tom)

嗯,因为我正在编辑我的一段时间,所以我没有注意到您的答案已经发布。
muru

23

您无需将插件存储在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文件一起分发的插件的许可条款的风险。

也可以看看:


5

我将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工具。


5

如果您想坚持使用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

忠告:我是子模块的新手。我不太确定他们的行为。


vim-pandemic是无需使用子模块即可增强病原体的另一种方法。大流行处理远程存储库,由病原体处理运行时路径。这确实意味着需要两个工具,但是对于“应该”分别处理的不同任务。
jalanb 2015年

任何人都可以评论为什么病原体自述文件中的tpope可能会说为什么子模块不可行吗?我也不知道子模块(而且即使没有插件管理器,我的解决方案对我来说也非常有效),但我猜反子模块的人群中有很多有趣的话要说。
dash-tom-bang

1
@ dash-tom-bang我没读那么多,因为他说不应该使用子模块。我认为他只是说这不是他的首选方法。
Rich

1
TBH使用了几年之后,我对子模块感到恼火。我现在建议不要使用它们。我现在使用vim-plug,这只会使我的生活更轻松。
大师

4

您只需将以下行添加到您的代码中.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相对),但是我认为该论点仍然适用,您需要一个可靠的环境来进行编码或写入。


1
“您可以仅将这行添加到您的.vimrc ...”,您是说.gitignore吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.