使用 vcsh 管理您的配置

作者:Bill Childers

如果您像我一样(难道您不想这样吗?),您可能经常使用不止一台 Linux 或 UNIX 机器。也许您有一台笔记本电脑和一台台式机。或者,也许您有几台服务器,您在这些服务器上拥有 shell 帐户。管理 mutt、Irssi 等应用程序的配置文件并不难,但管理开销变得乏味,尤其是在从一台机器移动到另一台机器或设置新机器时。

不久前,我开始使用 Dropbox 来管理和同步我的配置文件。我所做的是在 Dropbox 中创建几个文件夹,然后当我设置新机器时,我会安装 Dropbox,同步这些文件夹,并从这些目录中的配置创建符号链接到我主目录中所需的配置文件。例如,我有一个名为 Dropbox/conf/mutt 的目录,其中包含我的 .muttrc 文件。然后,我将创建一个符号链接,例如 ~/.muttrc -> Dropbox/conf/mutt/.muttrc。这行得通,但很快就失控了,维护起来非常麻烦。我不仅必须让 Dropbox 在 Linux 上工作,包括我的仅命令行服务器机器,而且我还必须确保我在正确的位置制作了一堆符号链接才能使一切正常工作。最后一根稻草是我得到了一台小型 ARM 驱动的 Linux 机器,并想在上面获取我的配置,并且意识到 Dropbox 同步守护程序没有 ARM 二进制文件。一定有另一种方法。

...还有另一种方法

事实证明,我不是唯一一个为此苦苦挣扎的人。vcsh 开发人员 Richard Hartmann 也遇到了这个特殊的难题,但他想出了一种解决它的方法:vcsh。vcsh 是一个脚本,它将 git 和 mr 包装到一个易于使用的工具中,用于配置文件管理。

所以,到现在,我敢打赌您会问:“您为什么要为此使用 git?这听起来太复杂了。” 在我真正开始使用它并深入研究之前,我也想过类似的事情。一旦您了解了工作流程,使用 vcsh 就有几个优点。使用 vcsh 的第一个也是主要优点是,您真正需要的只是 git、bash 和 mr——所有这些都非常容易获得(或者可以相对容易地构建)——因此不需要专有的守护程序或服务。使用 vcsh 的另一个优点是它利用了 git 的工作流程。如果您习惯于使用 git 签入文件,那么您在使用 vcsh 时会感到宾至如归。此外,由于 git 为整个系统提供动力,您可以获得将配置文件置于版本控制之下的好处,因此如果您不小心对文件进行了编辑而破坏了某些东西,则可以使用标准 git 命令非常容易地回滚。

让我们开始吧!

我假设您使用的是 Ubuntu 12.04 LTS 或更高版本,因为这使得安装变得容易。一个简单的 sudo apt-get install vcsh mr git 将安装 vcsh 及其依赖项。如果您使用的是其他 Linux 发行版或其他 UNIX 衍生版本,您可能需要检出 vcsh 和 mr,然后在未打包 git 的情况下构建 git。我还假设您在另一台机器上安装了可用的 git 服务器,因为 vcsh 在帮助保持机器之间配置同步方面确实很出色。

安装 vcsh 及其依赖项后,就可以开始使用 vcsh 了。让我们以一个相当常见的配置文件为例,大多数曾经使用过终端的人都有——vim 的配置文件。此文件位于您的主目录中,名为 .vimrc。如果您以前使用过 vim,则此文件将在此处。我将向您展示如何将其签入到 vcsh 控制下的 git 存储库中。

首先,运行以下命令来初始化 vcsh 的 vim git 存储库


bill@test:~$ vcsh init vim
vcsh: info: attempting to create '/home/bill/.config/vcsh/repo.d'
vcsh: info: attempting to create '/home/bill/.gitignore.d'
Initialized empty Git repository in 
 ↪/home/bill/.config/vcsh/repo.d/vim.git/

我喜欢将 vcsh 使用的“伪 git 存储库”视为几乎像 chroot 一样(如果您熟悉该概念),因为它使事情更容易处理。您将以某种方式“进入 chroot”,告诉 vcsh 您想在 vim 的伪 git 存储库中工作。这是通过以下命令完成的


bill@test:~$ vcsh enter vim

现在,您将通过运行以下命令将文件 .vimrc 添加到上面创建的存储库中


bill@test:~$ git add .vimrc

您在此处使用普通的 git,但在 vcsh 管理的环境中。这是 vcsh 的一个设计特性,使其功能与 git 非常相似。

现在您的文件正在被 vcsh 内的 git 存储库跟踪,让我们通过运行以下类似 git 的命令来提交它


bill@test:~$ git commit -m 'Initial Commit'
master (root-commit) bc84953 Initial Commit
 Committer: Bill Childers bill@test.home
 1 file changed, 2 insertions(+)
 create mode 100644 .vimrc

现在是最酷的部分。就像标准的 git 一样,您可以将文件推送到远程存储库。这使您可以通过一个命令使它们可用于其他机器。让我们现在这样做。首先,您将添加远程服务器。(我假设您已经设置了服务器并配置了正确的帐户。您还需要该服务器上的裸 git 存储库。)例如


bill@test:~$ git remote add origin git@gitserver:vim.git

接下来,将您的文件推送到该远程服务器


bill@test:~$ git push -u origin master
    Counting objects: 3, done.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 272 bytes, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To git@gitserver:vim.git
    * new branch      master -> master
    Branch master set up to track remote branch master from origin.
bill@test:~$ exit

请注意末尾的 exit 行。这会退出“vcsh 伪 git 存储库”。现在您的 .vimrc 文件已签入并复制到远程服务器!如果还有其他程序您想签入配置,例如 mutt,您只需运行 vcsh init mutt 创建一个新的存储库,然后再次运行整个过程,但这次,将您的文件签入到 mutt 存储库中。

将您的配置移动到另一台机器

要将您的配置同步到另一台机器,您只需要安装 vcsh、git 和 mr,然后运行与上述步骤类似的过程,但您将从您的服务器执行 git pull,而不是 push。这是因为您本地没有您想要的 .vimrc 文件,并且您想从远程 git 存储库中获取它。

执行此操作的命令是


bill@test2:~$ sudo apt-get install vcsh git mr
bill@test2:~$ vcsh enter vim
bill@test2:~$ git remote add origin git@gitserver:vim.git
bill@test2:~$ git pull -u origin master
From gitserver:vim
* branch            master     -> FETCH_HEAD
bill@test2:~$ exit

现在您已经在第二台主机上获得了已签入的 .vimrc 文件!此过程有效,但有点笨拙,并且当您开始生成多个存储库时,它可能会变得难以管理。幸运的是,有一个工具可以解决这个问题,它被称为 mr。

使用 mr 整合一切

如果您计划将多个存储库与 vcsh 一起使用(您应该这样做——我现在正在跟踪 13 个存储库),那么为 mr 设置配置至关重要。mr 为您带来的好处是提供了一种管理您使用 vcsh 跟踪的所有存储库的方法。它允许您通过简单地调整每个存储库的一个符号链接来启用和禁用存储库,并且它还使您能够通过运行一个简单的命令来更新所有存储库:mr up

开始使用 mr 的最佳方法可能是克隆 vcsh 作者提供的存储库。这是通过以下命令完成的


bill@test2:~$ vcsh clone 
 ↪git://github.com/RichiH/vcsh_mr_template.git mr
Initialized empty Git repository in 
 ↪/home/bill/.config/vcsh/repo.d/mr.git/
remote: Counting objects: 19, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 19 (delta 1), reused 15 (delta 0)
Unpacking objects: 100% (19/19), done.
From git://github.com/RichiH/vcsh_mr_template
* new branch      master     -> origin/master

现在您已经克隆了 mr 存储库,您需要进入并编辑文件以指向您的设置。mr 的控制文件位于 ~/.config/mr/available.d 中,因此请转到该目录


bill@test2:~/.config/mr/available.d$ ls
mr.vcsh  zsh.vcsh

将 zsh.vcsh 文件重命名为 vim.vcsh,因为您正在使用 vim,并将存储库路径更改为指向您的服务器


bill@test2:~/.config/mr/available.d$ mv zsh.vcsh vim.vcsh
bill@test2:~/.config/mr/available.d$ vi vim.vcsh
[$HOME/.config/vcsh/repo.d/vim.git]
checkout = vcsh clone git@gitserver:vim.git vim

此外,编辑 mr.vcsh 文件以指向您的服务器


bill@test2:~/.config/mr/available.d$ vi mr.vcsh
[$HOME/.config/vcsh/repo.d/mr.git]
checkout = vcsh clone git@gitserver:mr.git mr

mr 工具依赖于从 available.d 目录到 config.d 目录的符号链接(很像 Ubuntu 的 Apache 配置,如果您熟悉它)。mr 就是这样确定要同步哪些存储库的。由于您已经创建了一个 vim 存储库,请创建一个符号链接来告诉 mr 同步 vim 存储库


bill@test2:~/.config/mr/available.d$ cd ../config.d
bill@test2:~/.config/mr/config.d$ ls -l
total 0
lrwxrwxrwx 1 bill bill 22 Jun 11 18:14 mr.vcsh -> 
 ↪../available.d/mr.vcsh
bill@test2:~/.config/mr/config.d$ ln -s 
 ↪../available.d/vim.vcsh vim.vcsh
bill@test2:~/.config/mr/config.d$ ls -l
total 0
lrwxrwxrwx 1 bill bill 22 Jun 11 18:14 mr.vcsh -> 
 ↪../available.d/mr.vcsh
lrwxrwxrwx 1 bill bill 23 Jun 11 20:51 vim.vcsh -> 
 ↪../available.d/vim.vcsh

现在,设置 mr 以使其能够同步到您的 git 服务器


bill@test2:~/.config/mr/config.d$ cd ../..
bill@test2:~/.config$ vcsh enter mr
bill@test2:~/.config$ ls
mr  vcsh
bill@test2:~/.config$ git add mr
bill@test2:\~/.config$ git commit -m 'Initial Commit'
[master fa4eb18] Initial Commit
Committer: Bill Childers [bill@test2.home]
3 files changed, 4 insertions(+), 1 deletion(-)
create mode 100644 .config/mr/available.d/vim.vcsh
create mode 120000 .config/mr/config.d/vim.vcsh
bill@test2:\~/.config$ git remote add origin git@gitserver:mr.git
fatal: remote origin already exists.

糟糕!为什么远程源已经存在?这是因为您从作者的存储库克隆了该存储库。删除它,然后创建您自己的


bill@test2:~/.config$ git remote show
origin
bill@test2:~/.config$ git remote rm origin
bill@test2:~/.config$ git remote add origin git@gitserver:mr.git
bill@test2:~/.config$ git push -u origin master
Counting objects: 28, done.
Compressing objects: 100% (21/21), done.
Writing objects: 100% (28/28), 2.16 KiB, done.
Total 28 (delta 2), reused 0 (delta 0)
To git@gitserver:mr.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
bill@test2:~/.config$ exit

就这样!但是,现在 mr 已加入,您只需执行 vcsh clone git@gitserver:mr.git mr 即可克隆您的 mr 存储库,然后执行 mr up,该机器将自动拥有您的所有存储库。

结论

vcsh 是一个非常强大的 shell 工具,需要一些时间来调整您的思维过程以适应它。但是,一旦您这样做了,设置新机器(或机器上的帐户)就会变得轻而易举,并且它还为您提供了一种轻松保持同步的方法。在过去的几个月里,它为我节省了很多时间,并且它使我能够从我所做的错误的配置更改中快速恢复。自己去看看吧!

设置远程 Git 仓库

关于设置远程 git 仓库的快速说明:您需要使用 SSH 密钥设置无密码身份验证(有关更多信息,请参阅资源)。一旦您使用“git”用户进行此操作,您只需以 git 用户身份创建一个 git 仓库即可。这很容易做到,只需运行命令


git@gitserver:~$ git init --bare vim.git
Initialized empty Git repository in /home/git/vim.git/

您的裸仓库将准备好供您的 vcsh 客户端签入内容!

资源

vcsh 主页:http://github.com/RichiH/vcsh

mr 主页:http://joeyh.name/code/mr

vcsh 背景幻灯片:https://raw.github.com/RichiH/talks/slides/2012/fosdem/vcsh/fosdem-2012-vcsh-talk.pdf

如何设置您自己的 Git 服务器:http://tumblr.intranation.com/post/766290565/how-set-up-your-own-private-git-server-linux

设置无密码 SSH 密钥身份验证:http://askubuntu.com/questions/46930/how-can-i-set-up-password-less-ssh-login

加载 Disqus 评论