在 UNIX 操作系统中,我们通常会设置多种配置文件,以实现不同 CLI 工具定制化。对配置文件实现版本控制有利于实现历史回溯、远程备份、自动化部署等实用功能。
一个常规的配置文件版本控制逻辑是,我们单独为配置文件创建一个项目,再通过软链接对所有配置文件进行备份和统一管理。通过利用 Git 的 bare repo 功能,我们可以实现无项目文件依赖的版本控制,直接以 $HOME
作为根目录,轻松实现任意层级配置文件的跟踪和部署。
在 $HOME
路径下创建 bare repo:
$ git init --bare $HOME/.dotfiles
该命令会在 $HOME
目录下初始化一个用于版本控制 bare repo 的 Git 隐藏目录(.dotfiles
),与我们平常所见到的 .git
功能一致。
在 Shell 配置文件(~/.bashrc
或 ~/.zshrc
)中为当前 bare repo 创建 alias:
export dotfiles='git --git-dir $HOME/.dotfiles --work-tree $HOME'
该命令对 bare repo 进行配置,设置 .dotfiles
以 $HOME
作为工作目录,后续配置文件可通过相对于$HOME
的路径进行添加。
以 $HOME
作为工作目录会导致 Git 默认可以跟踪 $HOME
下任意文件,而我们可以设置 Git 默认不跟踪任何文件:
$ dotfiles config --local status.showUntrackedFiles no
当我们需要跟踪某个配置文件时,再通过 dotfiles add
主动添加。
$ dotfiles status
$ dotfiles add ...
$ dotfiles commit -m ...
$ dotfiles remote add origin <github-url>
$ dotfiles push origin main
在 alias 配置文件(~/.bashrc
或 ~/.zshrc
)中为 bare repo 创建 alias:
export dotfiles='git --git-dir $HOME/.dotfiles.git/ --work-tree $HOME'
$ echo ".dotfiles" >> 。gitigonre
防止在clone远程 repo 时出现无限递归问题。
git clone --bare <github-url> $HOME/.dotfiles
$ dotfiles checkout
⚠️ 注意:当本地已经存在与远程配置同类型的配置文件时,执行上述命令会报错,解决方式是删除或备份本地冲突文件。
自动化备份一行流(不适用于嵌套目录):
mkdir .dotfiles.bak && dotfiles checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I {} mv {} .dotfiles.bak/{}
$ dotfiles config --local status.showUntrackedFiles no
lazygit
打开bare repo:$ alias dotfile-lazy='lazygit --git-dir $HOME/.dotfiles.git/ --work-tree $HOM'