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

评论

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

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

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

编辑。我希望我已经更清楚地问我:“我该怎么做?”

只需使用neobundle之类的插件管理器即可。

#1 楼

如何处理存储库中的存储库一直是git的问题。 Git的子模块是解决这种情况的一种方法,但代价是要增加一些复杂性以进行跟踪。 git站点介绍了子模块。

基本思想是保留对与存储库中的路径关联的另一个git存储库的引用。这些引用存储在存储库根目录中的文件.gitmodules中(该文件由git管理,请不要管它)。克隆具有子模块的存储库时,会出现一些复杂性:必须显式地git submodule init创建.gitmodules文件,然后git submodule update克隆子模块。如何使用子模块将新的vim插件添加到我的dotfiles存储库(我将这个仓库的~/.vim/别名为.vim/)中,该模块使用以下子模块:将会显示您已经修改(或创建)了submodule add文件,如下所示: Git现在特别对待该路径:它是文件系统上的普通目录(因此vim会正常加载它),但是git status会将其视为来自其存储库的特定提交。在查看该路径的差异或日志(例如.gitmodules)时,git会将其显示为单行字符串,如下所示:该插件对应于进入子模块的存储库并签出新的提交,然后将其提交到您的存储库:

$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir


评论


谢谢,这看起来就像我想要的东西!

–汤姆
2015年2月6日在19:05

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

–muru
2015年2月6日,19:29

#2 楼

您无需将插件存储在VCS中。您也可以使用Vim软件包管理器。从昨天开始,我使用vim-plug:

您可以像这样在vimrc中定义插件:使用以下命令安装插件:

call plug#begin('~/.vim/plugged')

Plug 'embear/vim-localvimrc'
Plug 'kchmck/vim-coffee-script'
" ... etc

call plug#end()


或者,您可以在plug#begin()调用之前将FAQ中的摘录添加到vimrc文件中:

:PlugInstall


这会将插件放入~/.vim/plugged中。您无需将此文件保留在VCS中。如果要在另一台计算机上使用此vimrc,只需在该计算机上调用:PlugInstall

要删除插件,请将其从vimrc文件中删除并运行: br />
请注意,vim-plug不支持从Vim脚本网站安装脚本,但是这些脚本是在GitHub上镜像的,因此没有必要这样做。还具有一些其他优点,例如更容易更新插件以及按需加载以提高性能。您也没有冒着违反要随vimrc文件分发的插件的许可条款的风险。

另请参见:


是什么
如何在vim / vi中安装插件?


#3 楼

我将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的diff工具。 Vimdiff是最好的diff工具。

#4 楼

如果您想坚持使用“病原菌”,一种方法是使用Git子模块。当您添加子模块时,git会将其识别为来自另一个存储库,并保留其内容(除非已更改,否则在执行git status时,它将显示为未跟踪内容)。如果您所有基于Github的插件都在bundle/中,那么将它们作为子模块添加是具有良好外壳的相当简单的任务:

for f in bundle/*/ 
do 
    git submodule add $(awk '/url =/{print }' "$f/.git/config") "$f"
done





如果将文件添加到子模块,或进行一些不影响存储库的更改,则git status仍会抱怨子模块具有未提交的更改或未跟踪的文件。您可以通过将ignore = dirty添加到.gitmodules文件中的子模块配置中,使git忽略此类更改。例如:

[submodule "bundle/LaTeX-Box"]
    path = bundle/syntastic
    url = https://github.com/scrooloose/syntastic.git
    ignore = dirty



子模块的一个好处是,子模块的修订版已添加到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



最后,一个命令将它们全部更新!

git submodule foreach git pull


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

评论


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

–贾兰布
2015年2月9日在10:43

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

–dash-tom-bang
16-2-22在18:11

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

–丰富
18年3月13日在15:27

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

–muru
18年3月13日在15:40

#5 楼

您可以仅将以下行添加到.gitignore中,以忽略所有插件,而不提交它们:因为它们已经是github仓库。我猜你的意思是您不想重复代码,但是我听说它说您应该继续复制依赖项的代码,这样您就可以始终返回到代码中的特定点并知道它会工作。以下是詹姆斯·肖尔(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相对),但是我认为该论点仍然适用,您需要一个可靠的环境来编写或编写代码。

评论


“您可以将这行添加到您的.vimrc ...中。”您是说.gitignore吗?

–user72
2015年2月6日,19:38