Dotfiles 就是我们在使用软件的时候,软件为了存储我们个人偏好设置而建立的一个以 .
开头的文件。例如,vim 的配置文件就是 .vimrc
,zsh 的配置文件就是 .zshrc
。这些文件通常存储在用户的 home 目录中。但是,在不同的电脑上工作时,如果需要使用相同的配置,我们可以考虑使用版本控制工具来管理这些文件。或者在一台新电脑上想快速配置好环境,也可以使用版本控制工具来管理这些文件。Yadm 就可以帮助我们完成这些需求。
安装 yadm
安装
安装 yadm
非常简单,只需在终端输入以下命令:
sudo apt-get install yadm
初始化 yadm 仓库
创建一个新的 yadm 仓库很容易,只需在 home 目录中运行以下命令:
yadm init
现在,yadm 已经创建了一个空白的 git 仓库。
存储库位置/home/nic/.local/share/yadm/
添加 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
文件。只需按照以下步骤即可:
- 在另一台计算机上安装 yadm 并初始化 yadm 仓库。
- 将远程仓库克隆到该计算机的 yadm 仓库中:
yadm clone https://github.com/[用户名]/dotfile.git
- 此时,您的 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 |
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
就会根据当前的系统自动选择合适的配置文件。