使用 Yadm 管理并同步配置文件 Dotfile

Dotfiles 就是我们在使用软件的时候,软件为了存储我们个人偏好设置而建立的一个以 . 开头的文件。例如,vim 的配置文件就是 .vimrc,zsh 的配置文件就是 .zshrc。这些文件通常存储在用户的 home 目录中。但是,在不同的电脑上工作时,如果需要使用相同的配置,我们可以考虑使用版本控制工具来管理这些文件。或者在一台新电脑上想快速配置好环境,也可以使用版本控制工具来管理这些文件。Yadm 就可以帮助我们完成这些需求。

安装 yadm

安装

安装 yadm 非常简单,只需在终端输入以下命令:

sudo apt-get install yadm

初始化 yadm 仓库

创建一个新的 yadm 仓库很容易,只需在 home 目录中运行以下命令:

yadm init

现在,yadm 已经创建了一个空白的 git 仓库。

添加 dotfile 文件

要将现有的 dotfile 添加到 yadm 仓库中,请使用以下命令:

yadm add ~/.zshrc

一旦您完成了对要添加的文件的更改并将它们添加到 yadm 仓库中,您需要提交它们。可以使用以下命令:

yadm commit -m "Add .zshrc file to yadm repository"

建立远程仓库

使用 yadm 还可以将 dotfile 文件同步到 GitHub 等 Git 托管服务中。

登录 Github,创建一个新的仓库。例如,您可以创建一个名为 dotfile 的仓库。现在,您需要将本地仓库与远程仓库连接起来。要将本地仓库连接到远程仓库,请使用以下命令:

yadm remote add origin https://github.com/[用户名]/dotfile.git

现在 yadm 已经连接到您在 Github 上创建的仓库。要将本地代码上传到远程仓库,请使用以下命令:

yadm push

使用多台电脑时如何同步配置

假设需要在多个计算机之间共享 dotfile 文件。只需按照以下步骤即可:

  1. 在另一台计算机上安装 yadm 并初始化 yadm 仓库。
  2. 将远程仓库克隆到该计算机的 yadm 仓库中:
    yadm clone https://github.com/[用户名]/dotfile.git
  3. 此时,您的 dotfile 文件应在计算机上自动更新。

执行完 clone 命令后实际上就是 yadm 会把远程仓库的文件都拷贝到本地。

如果本地有修改和远程有冲突怎么办

如果本地有修改,远程也有修改,那么就会产生冲突。这时候需要先解决冲突,然后再提交。

每台电脑的配置不一样怎么办

比如我们会在.zshrc中配置一些环境变量,但是每台电脑的环境变量可能不一样。这时候我们可以在.zshrc中添加一些判断,比如我们可以简单的判断一下主机名,然后根据主机名来加载不同的配置。

if [ $HOSTNAME = "xxx" ]; then
    # xxx的配置
elif [ $HOSTNAME = "yyy" ]; then
    # yyy的配置
fi

但有一些配置文件可能不支持这样的添加语句,比如.gitconfig,这时候我们可以使用 yadm 的 Alternate Files 功能解决。

Alternate Files 是一个用于管理同一文件不同版本的功能,有时在不同的主机、操作系统和用户需要不同的文件。Alternate Files 允许使用同一个文件名字,在文件名后添加一个带有条件的后缀,例如##os.Linux,hostname.host1,class.work,yadm 会根据当前系统的特定条件自动选择适当的版本,并创建符号链接。如果没有符合条件的版本,它将选择默认版本。

就以.gitconfig配置文件为例,我们通常在公司的电脑和家里的电脑配置不太一样,比如公司使用下面的配置:

[user]
	email = 公司邮箱
	name = 公司用户名

在家里使用下面的配置:

[user]
    email = 日常使用邮箱
    name = 日常使用用户名

配置文件不支持条件语句,所以无法通过直接在同一个配置文件里完成不同环境的配置。这就用到了 Alternate Files 功能,我们可以复制两个.gitconfig文件后面添加一个条件后缀,比如.gitconfig##class.work,然后在.gitconfig##class.work文件中添加公司的配置,.gitconfig文件中添加家里的配置。这样 yadm 就会根据当前的主机名自动选择合适的配置文件。并把这三个文件都加入到 yadm 仓库中。

yadm add ~/.gitconfig
yadm add ~/.gitconfig##class.work
yadm add ~/.gitconfig##class.home

那么 yadm 是如何实现不同环境的切换呢?我们还需要进一步配置,有注意到我们的配置文件名中的class属性吗,这是 yadm 支持的条件属性之一。我们可以通过yadm config命令来配置当前电脑的属性。比如我们配置公司电脑的class属性为work,家里的电脑的class属性为home

yadm config local.class work

我们执行完此命令后,yadm 会自动为.gitconfig文件添加一个软链接,链接到.gitconfig##class.work文件。这样我们就可以在公司电脑上使用公司的配置了。如果我们在家里的电脑上执行yadm config local.class home,那么 yadm 会自动为.gitconfig文件添加一个软链接,链接到.gitconfig##class.home文件。这样我们就可以在家里的电脑上使用家里的配置了。

yadm 支持以下这些条件:

属性 意义
arch, a 如果值匹配架构则有效。通过运行 uname -m 计算架构。
class, c 如果值匹配 local.class 配置,则有效。必须使用“yadm config local.class ”手动设置 Class。
default 当没有其他备选项有效时有效。
distro, d 如果值与发行版匹配,则有效。通过运行 lsb_release -si或检查/etc/os-release来计算分布。
distro_family, f 如果值匹配发行版系列,则有效。通过检查/etc/os-release 中的 ID_LIKE 行计算发行版系列。
extension, e 一种特殊的“条件”,不影响选择过程。它的目的是允许备选文件以特定扩展名结尾,例如使编辑器正确突出显示内容。
hostname, h 如果值匹配短主机名,则有效。通过运行 uname -n,并去除任何域来计算主机名。
os,o 如果值与操作系统匹配,则有效。通过运行 uname -s 计算 OS。*
template, t 当值与支持的模板处理器匹配时有效。有关更多详细信息,请参见模板部分。
user, u 如果值匹配当前用户,则有效。通过运行 id -u -n 计算当前用户。

再举个例子,上面用的 class 条件是必须通过yadm config local.class <class>手动设置的。但是有一些条件不需要手动设置 yadm 可以自动识别。比如 os 属性。我们将.zshrc文件复制两份份,命名为.zshrc##os.Linux.zshrc##os.Darwin,然后在.zshrc##os.Linux文件中添加一些 Linux 系统的配置,.zshrc##os.Darwin文件中添加一些 Mac 系统的配置。并把这三个文件都加入到 yadm 仓库中。这样 yadm 就会根据当前的系统自动选择合适的配置文件。