开始,开始,开始使用吧! 
 
1. 功能简介 
User-specific app config is stored in so called dotfiles 
 
您开始尝试对配置进行新的更改,现在一切都被破坏了。yadm 可以帮助你决定什么改变了,或者简单地恢复你所有的改变。
您已经花费了时间调整您的计算环境。一切都按照你想要的方式运作。太棒了!然后你的硬盘出了故障,电脑需要重建。
你得到了一台新电脑,你想要重新创建那个环境。您可能希望两台机器的配置保持同步。
2. 工作方式 
Yet Another Dotfiles Manager 
 
yadm 就像有一个版本的 Git,它只在你的 dotfiles 上运行。如果你知道如何使用 Git 工具的话,你已经知道如何使用 yadm 了。
如果您的工作目录是另一个 Git 管理的存储库,这并不重要。 
不必移动 dotfiles 或者将它们从另一个位置符号链接起来。 
Yadm 自动继承了 Git 的所有特性,允许你分支、合并、重建、使用子模块等。 
实际上 yadm 底层依旧是使用 Git 来做管理的,即 yadm 在管理 dotfiles 的时候,实际上是用 Git 来进行版本控制、远程同步等操作的。但是,yadm 在 Git 工具功能的基础之上,进行了合理的功能拓展。
使用单一存储库 
几乎没有任何依赖 
能够使用基于操作系统或主机的备用文件 
能够加密和跟踪机密文件 
 
3. 安装方式 
安装方式原来很简单 
 
1 $ apt-get install -y yadm 
1 2 $ curl -fLo /usr/local /bin/yadm https://github.com/TheLocehiliosan/yadm/raw/master/yadm $ chmod a+x /usr/local /bin/yadm 
4. 快速开始 
只需要简单几个步骤, 
 
在 Github 上面创建一个空的仓库,推荐使用私有仓库,况且现在私有仓库已经免费开放了。不然,一旦将私有的内容同步上去的话,那就非常尴尬且危险了。之后,再我们的家目录(~/)下面进行初始化并添加到仓库里面进行管理。
1 2 3 4 5 6 7 8 9 10 $ yadm init $ yadm add <file/dir> $ yadm commit -m "info"  $ yadm remote add origin <github url> $ yadm push -u origin master 
1 2 3 $ yadm clone  <github url> $ yadm status 
从此开始,我们就可以使用 yadm 来专属管理我们分散在系统中各个地方的配置文件或者重要目录了,即专属的 Dotfiles 管家。
1 2 3 4 5 6 7 8 9 10 $ yadm list | head -2 .tmux.conf .zshrc $ yadm status On branch master Your branch is up to date with 'origin/master'  nothing to commit (use -u to show untracked files) 
5. 命令使用 
先来掌握下 yadm 命令的使用吧! 
 
编号 
Yadm 命令参数 
参数对应含义解释 
 
 
1 
yadm status查看状态 
 
2 
yadm fetch远程获取 
 
3 
yadm push推送配置 
 
4 
yadm diff对比差异 
 
5 
yadm diff --cached对比差异 
 
6 
yadm list管理列表 
 
7 
yadm list -a管理列表 
 
8 
yadm clone克隆项目 
 
9 
yadm clone --bootstrap克隆项目 
 
10 
yadm checkout状态迁出 
 
11 
yadm checkout -b状态迁出 
 
12 
yadm encrypt文件解密 
 
13 
yadm decrypt文件解密 
 
14 
yadm decrypt -l文件加密 
 
15 
yadm commit --amend用新的提交替换上次提交 
 
16 
yadm alt创建符号链接 
 
17 
yadm remote -v查看远程仓库地址 
 
 
6. 自动配置 
使用 Yadm 来自动配置环境 
 
咳咳咳,我们使用 yadm 工具不光光是可以管理我们的 Dotfiles 文件或者目录,而且还可以使用它的 bootstrap 功能来完成初始化电脑时许多工具的安装。 
使用 bootstrap 功能可以自动将任务脚本的执行 hook 在 yadm 克隆之后,来完成环境的全自动部署。这里不论是 Bash 脚本、Python 脚本还是什么别的,只要是可执行文件就可以。 
 
1 2 $HOME /.config/yadm/bootstrap/
创建和准备好下述脚本之后,我们就可以执行 yadm bootstrap 命令来手动执行检测一下了。当然,我们编写的 bootstrap 文件也是可以使用 yadm 工具来进行管理的。 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/bin/sh system_type=$(uname -s) is_command     command  -v "$1 "  > /dev/null 2>&1 } if  [ ${system_type}  = "Darwin"  ]; then     if  ! is_command zsh; then          echo  "Installing zsh..."          brew install zsh         if  [ $? -eq 0 ]; then              echo  "All packages are installed."          else              echo  "Install zsh error."          fi      fi  fi 
7. 隐私保护 
使用 Yadm 来隐私保护 
 
对敏感文件(比如 SSH 密钥)进行加密、解密,提供私有仓库以外的额外一层保护,非常有用且重要。但是,这样做会将纯文本数据放入 Git 存储库,后者通常驻留在公共系统中。 
然而 yadm 实现了一个特性,可以很容易地对一组文件进行加密和解密,这样加密后的版本就可以保存在 Git 仓库中。这个特性只有在 gpg 命令可用的情况下才能工作。建议您在保存机密文件时使用私有存储库,即使这些文件是加密的。 
 
1 2 3 4 5 $HOME /.config/yadm/encrypt$HOME /.config/yadm/files.gpg
要使用这个特性,必须创建一个模式列表,保存对应内容到上述的默认配置文件中即可。这样 yadm 加密命令会找到所有与模式匹配的文件,并提示输入密码。一旦确认了密码,匹配的文件将被加密并保存为 files.gpg 文件。 
 
1 2 $ cat $HOME /.config/yadm/encrypt .ssh/*.key 
接下来需要做的就是和普通添加文件或目录操作一致,即使用 yadm 提交到远程仓库中去。以后要解密这些文件,或者在另一个系统上运行 yadm 解密并提供正确的密码。默认情况下,任何解密文件都会被删除其 “group”  和 “others”  权限。 
 
1 2 3 $ yadm add .config/yadm/encrypt $ yadm add .config/yadm/files.gpg 
默认情况下使用的是对称加密,但使用 yadm.gpg-receiver 配置可以启用非对称加密。要做到这一点,请运行如下命令即可。为此,接收者地址中必须存在 gpg 的秘钥才可以。 
 
1 2 $ yadm config yadm.gpg-recipient <recipient-address> 
8. 配置分类 
使用 Yadm 来配置分类 
 
如果可能的话,最好在所有系统上使用相同的文件。但是,在某些场合您需要不同的文件。即针对不同的操作系统、不同的环境,需要维护不同种类的同一软件或插件的 dotfile 文件,可以使用如下两个插件来解决。
Alternate Files 
 
使用上述的 Alternate Files 功能时,Yadm 为不同的操作系统、主机、用户会自动创建一个符号链接到适当的文件版本上,一个有效的后缀被附加到文件名,即后缀中包含使用该文件必须满足的条件。 
 
每个条件都是一个 属性/值  对,由一个句点分隔。有些条件不需要 “值” ,在这种情况下,可以省略句点和值,且大多数属性可以缩写为一个单独的字母。 
 
Attribute 
Meaning 
 
 
template, tValid when the value matches a supported template processor. See the Templates  section for more details. 
 
user, uValid if the value matches the current user. Current user is calculated by running id ‑u ‑n. 
 
distro, dValid if the value matches the distro. Distro is calculated by running lsb_release ‑si or inspecting /etc/os-release 
 
os, oValid if the value matches the OS. OS is calculated by running uname ‑s. 
 
class, cValid if the value matches the local.class configuration. Class must be manually set using yadm config local.class <class>. 
 
hostname, hValid if the value matches the short hostname. Hostname is calculated by running hostname, and trimming off any domain. 
 
defaultValid when no other alternate is valid. 
 
 
1 2 3 4 5 6 7 8 9 $HOME /path/example.txt$HOME /path/example.txt$HOME /path/example.txt$HOME /path/example.txt$HOME /path/example.txt$HOME /path/example.txt$HOME /path/example.txt$HOME /path/example.txt
模板是另一个在每个主机上创建替代内容的强大工具,你应该尝试在每个系统上使用相同的文件。 
 
1 2 3 4 5 let  OS=substitute(system('uname -s' ),"\n" ,"" ,"" )if  (OS == "Darwin" )    " do something that only makes sense on a Mac  endif 
1 2 3 4 5 6 7 system_type=$(uname -s) if  [ "$system_type "  = "Darwin"  ]; then     eval  $(gdircolors $HOME /.dir_colors) else     eval  $(dircolors -b $HOME /.dir_colors) fi 
Templates 
 
模板是一种特殊的 alternate 文件,模板内容和主机特定的数据结合起来作为输入到一个模板处理文件中,该文件产生一个新的文件作为其输出。如果你需要改变一个文件的一小部分,这会非常有用,但是它不支持任何类型的头文件。 
 
Processor 
Suffixes 
Dependencies 
 
 
default 
##template, ##template.defaultawk must be installed. (This should be installed on all linux systems) 
esh 
##template.eshesh must be installed. 
j2cli 
##template.j2, ##template.j2clij2cli must be installed. 
envtpl 
##template.j2, ##template.envtplenvtpl must be installed. 
 
Default (built-in) 
Jinja or ESH 
Description 
Source 
 
 
yadm.classYADM_CLASSLocally defined yadm class 
yadm config local.class 
yadm.distroYADM_DISTRODistribution 
lsb_release ‑si 
or /etc/os-release 
 
yadm.hostnameYADM_HOSTNAMEHostname 
hostname (without domain) 
yadm.osYADM_OSOperating system 
uname ‑s 
yadm.userYADM_USERCurrent user 
id ‑u ‑n 
yadm.sourceYADM_SOURCETemplate filename 
(fully qualified path) 
 
 
1 2 3 4 5 {% if  yadm.os == "Darwin"  %} This block is included for  MacOS {% else  %} This block is included for  any other OS {% endif %} 
9. 扩展配合 
管理 $HOME 以外的文件 
 
在默认的情况下,yadm 工具仅仅只会管理 $HOME 下的文件和目录,这大部分情况下也是完全合理以及必要的。即我们家目录下面的文件,并不会管理其他的目录层级,比如 /etc/ 等。 
但是,我们要想管理 $HOME 以外的文件,即扩大文件树的管理范围,就要对其进行一些必要的改造。首先,需要管理的区域要有可读写的权限。然后,执行如下操作即可。 
 
1 2 $ alias  sysyadm="sudo yadm -Y $HOME /.yadm"  
配置好上面的命令别名之后,就可以使用 sysyadm 命令创建一个单独的远程仓库,来单独管理系统文件。即我们单独使用 sysyadm 命令来管理系统配置,和上面我们管理家目录的互不干扰,各司其职。 
 
1 2 3 4 5 6 7 $ sysyadm init -w / $ sysyadm add /etc/nginx/nginx.conf $ sysyadm commit -m "add nginx config"  $ yadm push 
10. 参考文档 
本文转载自:「 Escape 的博客 」,原文:https://tinyurl.com/y4r6d5fu,版权归原作者所有。欢迎投稿,投稿邮箱:  editor@hi-linux.com 。